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 将字符串按大写字母分隔成字符串数组
    Apr 30 PHP
    php中$_REQUEST、$_POST、$_GET的区别和联系小结
    Nov 23 PHP
    通达OA公共代码 php常用检测函数
    Dec 14 PHP
    php.ini-dist 和 php.ini-recommended 的区别介绍(方便开发与安全的朋友)
    Jul 01 PHP
    win7计划任务定时执行PHP脚本设置图解
    May 09 PHP
    PHP多线程之内部多线程实例分析
    Mar 09 PHP
    php实现求相对时间函数
    Jun 15 PHP
    php简单生成随机数的方法
    Jul 30 PHP
    基于php实现的php代码加密解密类完整实例
    Oct 12 PHP
    PHP基于方差和标准差计算学生成绩的稳定性示例
    Jul 04 PHP
    Laravel学习教程之request validation的编写
    Oct 25 PHP
    laravel框架中控制器的创建和使用方法分析
    Nov 23 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获取表单textarea数据中的换行问题
    2010/09/10 PHP
    php获取数组长度的方法(有实例)
    2013/10/27 PHP
    ThinkPHP中的系统常量和预定义常量集合
    2014/07/01 PHP
    PHP获取QQ达人QQ信息的方法
    2015/03/05 PHP
    jQuery对象和DOM对象相互转化
    2009/04/24 Javascript
    javascript同页面多次调用弹出层具体实例代码
    2013/08/16 Javascript
    javascript中判断json的方法总结
    2015/08/27 Javascript
    关于两个jQuery(js)特效冲突的bug的解决办法
    2016/09/04 Javascript
    微信小程序 教程之模板
    2016/10/18 Javascript
    jQuery的事件预绑定
    2016/12/05 Javascript
    js控制按钮,防止频繁点击响应的实例
    2017/02/15 Javascript
    VUEJS 2.0 子组件访问/调用父组件的实例
    2018/02/10 Javascript
    JavaScript实现百度搜索框效果
    2020/03/26 Javascript
    使用Vue自定义指令实现Select组件
    2018/05/24 Javascript
    js嵌套的数组扁平化:将多维数组变成一维数组以及push()与concat()区别的讲解
    2019/01/19 Javascript
    ES6 Symbol数据类型的应用实例分析
    2019/06/26 Javascript
    JavaScript自动生成 年月范围 选择功能完整示例【基于jQuery插件】
    2019/09/03 jQuery
    JS倒计时两种实现方式代码实例
    2020/07/27 Javascript
    [02:11]2016国际邀请赛中国区预选赛最美TA采访现场玩家
    2016/06/28 DOTA
    [01:27:30]LGD vs Newbee 2019国际邀请赛小组赛 BO2 第二场 8.16
    2019/08/19 DOTA
    python实现爬取图书封面
    2018/07/05 Python
    Python调用ffmpeg开源视频处理库,批量处理视频
    2020/11/16 Python
    pandas 数据类型转换的实现
    2020/12/29 Python
    python正则表达式re.match()匹配多个字符方法的实现
    2021/01/27 Python
    使用css3做0.5px的细线的示例代码
    2018/01/18 HTML / CSS
    TripAdvisor土耳其网站:全球知名旅行社区,真实旅客评论
    2017/04/17 全球购物
    NBA欧洲商店(西班牙):NBA Europe Store ES
    2019/04/16 全球购物
    普罗米修斯教学反思
    2014/02/06 职场文书
    求职简历自荐信
    2014/06/18 职场文书
    六查六看剖析材料
    2014/10/06 职场文书
    党员反对四风思想汇报范文
    2014/10/25 职场文书
    2015年平安创建工作总结
    2015/04/29 职场文书
    用Python进行栅格数据的分区统计和批量提取
    2021/05/27 Python
    手把手教你使用TensorFlow2实现RNN
    2021/07/15 Python
    mysql配置SSL证书登录的实现
    2021/09/04 MySQL
    「睡美人」爱洛公主粘土人开订
    2022/03/22 日漫