Laravel框架实现多个视图共享相同数据的方法详解


Posted in PHP onJuly 09, 2019

本文实例讲述了Laravel框架实现多个视图共享相同数据的方法。分享给大家供大家参考,具体如下:

最近在用Laravel写一个cms,还没有完成,但是也遇到了许多难点,比如cms后台每个视图都要展示相同的导航菜单数据。

环境:

PHP 7.1
Apache 2.4
MySQL 5.7
Laravel 5.4

  • 传统方法

假设使用传统的方法,应该是在每个控制器中都调用数据,然后把数据都塞给视图。

    $menu = DB::table('menu')->get();
    return view('xx',['menu'=>$menu]);
  • 稍微优化
  • 新建一个BaseController,然后让BaseController去获取数据,然后在每个控制器都继承BaseController,最后将数据塞到视图中。

    基类

    class BaseController{
      protected $menu = null;//菜单数据
      public function __construct(){
        $this->getMenu();//获取导航菜单
      }
      public function getMenu(){
        $this->menu = DB::table('menu')->get();
      }
    }

    A控制器

    class AController extends BaseController{
      public function index(){
        return view('admin.index',['menu'=>$this->menu,'user'=>$user]);
      }
    }

    缺点:在每个控制器中都需要重新设置相同的模板的数据(menu)

    • 最好优化方案

    使用Laravel中的View Composers来解决这个问题

    1、在App\Providers下创建一个ComposerServiceProvider类

    <?php
    namespace App\Providers;
    use Illuminate\Support\Facades\View;
    use Illuminate\Support\ServiceProvider;
    class ComposerServiceProvider extends ServiceProvider {
      /**
       * Register bindings in the container.
       *
       * @return void
       */
      public function boot() {
        // 基于类的view composer
        View::composer(
          'admin.common.*', 'App\Http\ViewComposers\AdminComposer'
        );
      }
      /**
       * Register the service provider.
       *
       * @return void
       */
      public function register() {
        //
      }
    }

    在boot方法中定义要监听的视图,还可以使用通配符,这里我写的是admin.common.*,如果admin.common.* 下的视图被渲染的话将会调用App\Http\ViewComposers\AdminComposer@composer 方法

    2、注册ComposerServiceProvider

    config/app.php文件下的providers数组中进行注册

    App\Providers\ComposerServiceProvider::class,

    3、创建AdminComposer类

    Laravel推荐把view composer类放在app\Http\ViewComposers目录下,这个目录一开始是没有的,需要新建

    <?php
    namespace App\Http\ViewComposers;
    use App\Libs\CommonUtils;
    use Illuminate\Http\Request;
    use Illuminate\View\View;
    class AdminComposer {
      private $data = null;//CommonUtils对象
      public function __construct(Request $request) {
        $this->data = new CommonUtils($request);//新建一个CommonUtils对象
      }
      public function compose(View $view) {
        $view->with([
          'admin' => $this->data->admin,
          'mbx' => $this->data->mbx,
          'menu' => $this->data->menu,
          'msg' => $this->data->msg
        ]);//填充数据
      }
    }

    在这里我在构造方法中创建了一个对象,这个对象中包含着数据

    5、CommonUtils文件

    <?php
    /**
     * Created by PhpStorm.
     * User: Administrator
     * Date: 2017/4/20 0020
     * Time: 19:49
     */
    namespace App\Libs;
    use App\Admin;
    use App\Perm;
    use Illuminate\Http\Request;
    use Illuminate\Support\Facades\DB;
    class CommonUtils {
      public $admin = null;//管理员对象
      public $menu = null;//菜单对象
      public $mbx = null;//面包屑对象
      public $msg = null;//消息对象
      /**
       * 构造函数
       */
      public function __construct(Request $request) {
        $this->init($request);
      }
      /**
       * 初始化函数
       */
      private function init(Request $request) {
        $this->getAdmin($request);
        $this->getMsg();
        $this->getMenu($request);
        $this->getMbx($request);
      }
      /**
       * 获取管理员数据
       */
      private function getAdmin() {
        $this->admin = session('admin');
      }
      /**
       * 获取后台菜单数据
       */
      private function getMenu(Request $request) {
        $menu = DB::table('menu')->where('parentid', 0)->orderBy('sort')->get();
        $router = $request->getPathInfo();
        $perm = new Perm();
        $mbx = $perm->getMbx($router);
        foreach ($menu as $k => $m) {
          $m->active = '';
          //读取子菜单
          $childMenu = DB::table('menu')->where('parentid', $m->id)->orderBy('sort')->get();
          if (count($childMenu) > 0) {
            foreach($childMenu as $v){
              $v->active = '';
              if($mbx[0]->router == $v->router){
                $v->active = 'active';
                $m->active = 'active';
              }
            }
            $m->childMenu = $childMenu;
          } else {
            $m->childMenu = null;
          }
        }
        $this->menu = $menu;
      }
      /**
       * 获取面包屑
       */
      private function getMbx(Request $request) {
        $router = $request->getPathInfo();
        $perm = new Perm();
        $mbx = $perm->getMbx($router);
        $this->mbx = $mbx;
      }
      /**
       * 获取未读消息
       */
      private function getMsg() {
        $adminModel = new Admin();
        $toId = $this->admin->id;
        $this->msg = $adminModel->getUnReadMsg($toId);
      }
    }

    在这里面分别获取了管理员、菜单、面包屑、消息数据,这些数据都是每个后台页面都要使用到的。

    注意:这里我将类定义成了CommonUtils,感觉名字取得不好,CommonUtils是存放在App\Libs下的,这个Libs文件夹是我新建的,用于存放工具类的。如果需要给App\Libs文件夹添加自动加载,需要在composer.json文件里做如下修改。

    Laravel框架实现多个视图共享相同数据的方法详解

    希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

    PHP 相关文章推荐
    用PHP查询域名状态whois的类
    Nov 25 PHP
    php下使用无限生命期Session的方法
    Mar 16 PHP
    phpmyadmin安装时提示:Warning: require_once(./libraries/common.inc.php)错误解决办法
    Aug 18 PHP
    PHP 小心urldecode引发的SQL注入漏洞
    Oct 27 PHP
    php读取文件内容的方法汇总
    Jan 24 PHP
    thinkphp实现图片上传功能
    Jan 13 PHP
    thinkphp框架下404页面设置 仅三步
    May 14 PHP
    PHP array_key_exists检查键名或索引是否存在于数组中的实现方法
    Jun 13 PHP
    如何使用PHP给图片加水印
    Oct 12 PHP
    php数据序列化测试实例详解
    Aug 12 PHP
    php实现算术验证码功能
    Dec 05 PHP
    PHP获取远程http或ftp文件的md5值的方法
    Apr 15 PHP
    Laravel5.1框架注册中间件的三种场景详解
    Jul 09 #PHP
    PHP使用 Pear 进行安装和卸载包的方法详解
    Jul 08 #PHP
    PHP 7.4中使用预加载的方法详解
    Jul 08 #PHP
    php apache开启跨域模式过程详解
    Jul 08 #PHP
    php如何把表单内容提交到数据库
    Jul 08 #PHP
    php利用array_search与array_column实现二维数组查找
    Jul 08 #PHP
    php实现获取近几日、月时间示例
    Jul 06 #PHP
    You might like
    PHP安装攻略:常见问题解答(二)
    2006/10/09 PHP
    ThinkPHP 表单自动验证运用示例
    2014/10/13 PHP
    php实现Mysql简易操作类
    2015/10/11 PHP
    PHP7+Nginx的配置与安装教程详解
    2016/05/10 PHP
    php将print_r处理后的数据还原为原始数组的解决方法
    2016/11/02 PHP
    laravel返回统一格式错误码问题
    2019/11/04 PHP
    由JavaScript中call()方法引发的对面向对象继承机制call的思考
    2011/09/12 Javascript
    浅析js中2个等号与3个等号的区别
    2013/08/06 Javascript
    利用js实现在浏览器状态栏显示访问者在本页停留的时间
    2013/12/29 Javascript
    JavaScript数组函数unshift、shift、pop、push使用实例
    2014/08/27 Javascript
    自己动手手写jQuery插件总结
    2015/01/20 Javascript
    Web程序员必备的7个JavaScript函数
    2016/06/14 Javascript
    浅谈js基本数据类型和typeof
    2016/08/09 Javascript
    浅谈JavaScript 覆盖原型以及更改原型
    2016/08/31 Javascript
    js中数组插入、删除元素操作的方法
    2017/02/15 Javascript
    详解在vue-cli3.0中自定css、js和图片的打包路径
    2019/08/26 Javascript
    JS设置自定义快捷键并实现图片上下左右移动
    2019/10/17 Javascript
    js实现鼠标切换图片(无定时器)
    2021/01/27 Javascript
    Python自定义函数的创建、调用和函数的参数详解
    2014/03/11 Python
    浅析python递归函数和河内塔问题
    2017/04/18 Python
    Python实现抓取网页生成Excel文件的方法示例
    2017/08/05 Python
    Python列表删除的三种方法代码分享
    2017/10/31 Python
    浅谈python之高阶函数和匿名函数
    2019/03/21 Python
    Python实现连接MySql数据库及增删改查操作详解
    2019/04/16 Python
    python实现坦克大战游戏 附详细注释
    2020/03/27 Python
    利用selenium爬虫抓取数据的基础教程
    2019/06/10 Python
    Tensorflow 实现将图像与标签数据转化为tfRecord文件
    2020/02/17 Python
    纯CSS3制作漂亮带动画效果的主机价格表
    2015/04/25 HTML / CSS
    关于box-sizing的全面理解
    2016/07/28 HTML / CSS
    Cotton On美国网站:澳洲时装连锁品牌
    2016/10/25 全球购物
    墨西哥巴士车票在线购买:ClickBus
    2018/03/27 全球购物
    《歌唱二小放牛郎》教学反思
    2014/04/19 职场文书
    彩色的翅膀教学反思
    2014/04/25 职场文书
    2015年教研员工作总结
    2015/05/26 职场文书
    军事博物馆观后感
    2015/06/05 职场文书
    九不准学习心得体会
    2016/01/23 职场文书