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 Sql Server连接失败问题及解决办法
    Aug 07 PHP
    php 上一篇,下一篇文章实现代码与原理说明
    May 09 PHP
    php下保存远程图片到本地的办法
    Aug 08 PHP
    php中处理mysql_fetch_assoc返回来的数组 不用foreach----echo
    May 04 PHP
    php使HTML标签自动补全闭合函数代码
    Oct 04 PHP
    php密码生成类实例
    Sep 24 PHP
    php实现基于微信公众平台开发SDK(demo)扩展的方法
    Dec 22 PHP
    学习php设计模式 php实现原型模式(prototype)
    Dec 07 PHP
    PHP字符串逆序排列实现方法小结【strrev函数,二分法,循环法,递归法】
    Jan 13 PHP
    PHP用continue跳过本次循环中剩余代码的注意点
    Jun 27 PHP
    PHP实现链表的定义与反转功能示例
    Jun 09 PHP
    PHP mkdir创建文件夹实现方法解析
    Nov 13 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
    smarty+adodb+部分自定义类的php开发模式
    2006/12/31 PHP
    9个实用的PHP代码片段分享
    2015/01/22 PHP
    PHP递归遍历多维数组实现无限分类的方法
    2016/05/06 PHP
    php实现根据身份证获取精准年龄
    2020/02/26 PHP
    刷新时清空文本框内容的js代码
    2007/04/23 Javascript
    关于jQuery新的事件绑定机制on()的使用技巧
    2013/04/26 Javascript
    jQuery on方法传递参数示例
    2014/12/09 Javascript
    Lua表达式和控制结构学习笔记
    2014/12/15 Javascript
    node.js操作mysql(增删改查)
    2015/07/24 Javascript
    javascript函数自动执行常用方法汇总
    2016/03/28 Javascript
    Vue.js实现多条件筛选、搜索、排序及分页的表格功能
    2020/11/24 Javascript
    微信小程序 弹框和模态框实现代码
    2017/03/10 Javascript
    ES6实现的遍历目录函数示例
    2017/04/07 Javascript
    使用Bootstrap打造特色进度条效果
    2017/05/02 Javascript
    Bootstrap 模态对话框只加载一次 remote 数据的完美解决办法
    2017/07/09 Javascript
    浅谈Angular4中常用管道
    2017/09/27 Javascript
    jQuery实现获取及设置CSS样式操作详解
    2018/09/05 jQuery
    JS实现移动端在线签协议功能
    2019/08/22 Javascript
    vue全屏事件开发详解
    2020/06/17 Javascript
    python进程管理工具supervisor使用实例
    2014/09/17 Python
    详解python时间模块中的datetime模块
    2016/01/13 Python
    python 列表降维的实例讲解
    2018/06/28 Python
    Python实现的IP端口扫描工具类示例
    2019/02/15 Python
    用Python写一个自动木马程序
    2019/09/17 Python
    Python上下文管理器类和上下文管理器装饰器contextmanager用法实例分析
    2019/11/07 Python
    python实现高斯投影正反算方式
    2020/01/17 Python
    Python内置方法和属性应用:反射和单例(推荐)
    2020/06/19 Python
    Python如何定义有可选参数的元类
    2020/07/31 Python
    Viking Direct爱尔兰:办公用品和家具
    2019/11/21 全球购物
    应届毕业生自我鉴定范文
    2013/12/27 职场文书
    组织关系转移介绍信
    2014/01/16 职场文书
    模具毕业生推荐信
    2014/02/15 职场文书
    公司授权委托书范本
    2014/04/03 职场文书
    法律系毕业生求职信
    2014/05/28 职场文书
    认识实习感想
    2015/08/10 职场文书
    redis缓存存储Session原理机制
    2021/11/20 Redis