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数组 为文章加关键字连接 文章内容自动加链接
    Dec 29 PHP
    PHP警告Cannot use a scalar value as an array的解决方法
    Jan 11 PHP
    PHP 修复未正常关闭的HTML标签实现代码(支持嵌套和就近闭合)
    Jun 07 PHP
    phpcms模块开发之swfupload的使用介绍
    Apr 28 PHP
    深入解析yii权限分级式访问控制的实现(非RBAC法)
    Jun 13 PHP
    PHP中mb_convert_encoding与iconv函数的深入解析
    Jun 21 PHP
    php最简单的删除目录与文件实现方法
    Nov 28 PHP
    php开发时容易忘记的一些技术细节
    Feb 03 PHP
    基于php流程控制语句和循环控制语句(讲解)
    Oct 23 PHP
    PHP实现合并两个排序链表的方法
    Jan 19 PHP
    php处理多图上传压缩代码功能
    Jun 13 PHP
    在Laravel 的 Blade 模版中实现定义变量
    Oct 14 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
    杏林同学录(七)
    2006/10/09 PHP
    一些使用频率比较高的php函数
    2008/10/03 PHP
    php 404错误页面实现代码
    2009/06/22 PHP
    php生出随机字符串
    2017/07/06 PHP
    php微信支付之公众号支付功能
    2018/05/30 PHP
    javascript检测是否联网的实现代码
    2014/09/28 Javascript
    JavaScript中的console.log()函数详细介绍
    2014/12/29 Javascript
    C#中使用迭代器处理等待任务
    2015/07/13 Javascript
    Java遍历集合方法分析(实现原理、算法性能、适用场合)
    2016/04/25 Javascript
    yarn与npm的命令行小结
    2016/10/20 Javascript
    使用bat打开多个cmd窗口执行gulp、node
    2017/02/17 Javascript
    Bootstrap按钮组实例详解
    2017/07/03 Javascript
    理解 Node.js 事件驱动机制的原理
    2017/08/16 Javascript
    jQuery简单实现向列表动态添加新元素的方法示例
    2017/12/25 jQuery
    关于vue中的ajax请求和axios包问题
    2018/04/19 Javascript
    angular实现input输入监听的示例
    2018/08/31 Javascript
    vue如何解决循环引用组件报错的问题
    2018/09/22 Javascript
    JavaScript封闭函数及常用内置对象示例
    2019/05/13 Javascript
    vue路由插件之vue-route
    2019/06/13 Javascript
    vue 实现滚动到底部翻页效果(pc端)
    2019/07/31 Javascript
    更优雅的微信小程序骨架屏实现详解
    2019/08/07 Javascript
    vue更改数组中的值实例代码详解
    2020/02/07 Javascript
    Python中的Numeric包和Numarray包使用教程
    2015/04/13 Python
    Python对数据进行插值和下采样的方法
    2018/07/03 Python
    Python利用pip安装tar.gz格式的离线资源包
    2020/09/14 Python
    python基于openpyxl生成excel文件
    2020/12/23 Python
    Bose美国官网:购买Bose耳机和音箱
    2019/03/10 全球购物
    Notino芬兰:购买香水和化妆品
    2019/04/15 全球购物
    自荐信如何“自荐”
    2013/10/24 职场文书
    十八届三中全会宣传方案
    2014/02/21 职场文书
    小学教学随笔感言
    2014/02/26 职场文书
    跳槽求职信范文
    2014/05/26 职场文书
    政工例会汇报材料
    2014/08/26 职场文书
    2014年保险公司工作总结
    2014/11/22 职场文书
    英文投诉信格式
    2015/07/03 职场文书
    开机音效回归! Windows 11重新引入开机铃声
    2021/11/21 数码科技