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 相关文章推荐
    一个用mysql_odbc和php写的serach数据库程序
    Oct 09 PHP
    在PHP3中实现SESSION的功能(二)
    Oct 09 PHP
    php分页代码学习示例分享
    Feb 20 PHP
    使用pthreads实现真正的PHP多线程(需PHP5.3以上版本)
    May 05 PHP
    PHP实现一维数组转二维数组的方法
    Feb 25 PHP
    PHP正则验证Email的方法
    Jun 15 PHP
    浅谈使用PHP开发微信支付的流程
    Oct 04 PHP
    php实现分页显示
    Nov 03 PHP
    PHP利用二叉堆实现TopK-算法的方法详解
    Apr 24 PHP
    thinkphp分页集成实例
    Jul 24 PHP
    Yii2.0使用阿里云OSS的SDK上传图片、下载、删除图片示例
    Sep 20 PHP
    ThinkPHP框架实现的邮箱激活功能示例
    Jun 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与MySQL交互使用详解
    2006/10/09 PHP
    应用开发中涉及到的css和php笔记分享
    2011/08/02 PHP
    PHP Cookie的使用教程详解
    2013/06/03 PHP
    ajax调用返回php接口返回json数据的方法(必看篇)
    2017/05/05 PHP
    解决form中action属性后面?传递参数 获取不到的问题
    2017/07/21 PHP
    PHP chr()函数讲解
    2019/02/11 PHP
    关于laravel框架中的常用目录路径函数
    2019/10/23 PHP
    Save a File Using a File Save Dialog Box
    2007/06/18 Javascript
    web的各种前端打印方法之jquery打印插件PrintArea实现网页打印
    2013/01/09 Javascript
    javascript 按键事件(兼容各浏览器)
    2013/12/20 Javascript
    javascript的事件触发器介绍的实现
    2014/06/05 Javascript
    Javascript基础教程之比较操作符
    2015/01/18 Javascript
    jQuery获取页面元素绝对与相对位置的方法
    2015/06/10 Javascript
    JS+CSS实现仿支付宝菜单选中效果代码
    2015/09/25 Javascript
    Angular2库初探
    2017/03/01 Javascript
    JS实现css hover操作的方法示例
    2017/04/07 Javascript
    AngularJS+bootstrap实现动态选择商品功能示例
    2017/05/17 Javascript
    Vue 列表上下过渡效果的实例代码
    2019/06/25 Javascript
    关于JS模块化的知识点分享
    2019/10/16 Javascript
    vue点击按钮实现简单页面的切换
    2020/09/08 Javascript
    用实例说明python的*args和**kwargs用法
    2013/11/01 Python
    在Python中操作字典之update()方法的使用
    2015/05/22 Python
    python通过apply使用元祖和列表调用函数实例
    2015/05/26 Python
    Python使用dis模块把Python反编译为字节码的用法详解
    2016/06/14 Python
    Python字符串通过'+'和join函数拼接新字符串的性能测试比较
    2019/03/05 Python
    python制作抖音代码舞
    2019/04/07 Python
    numpy下的flatten()函数用法详解
    2019/05/27 Python
    Python爬虫学习之获取指定网页源码
    2019/07/30 Python
    python+OpenCV实现车牌号码识别
    2019/11/08 Python
    物业管理大学生个人的自我评价
    2013/10/10 职场文书
    人事经理岗位职责
    2014/04/28 职场文书
    小学红领巾广播稿(3篇)
    2014/09/13 职场文书
    2015年初中元旦晚会活动总结
    2014/11/28 职场文书
    2015年教师业务工作总结
    2015/05/26 职场文书
    四年级语文教学反思
    2016/03/03 职场文书
    分布式Redis Cluster集群搭建与Redis基本用法
    2022/02/24 Redis