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数组函数序列之array_pop() - 删除数组中的最后一个元素
    Nov 07 PHP
    PHP调用Linux的命令行执行文件压缩命令
    Jan 27 PHP
    解析argc argv在php中的应用
    Jun 24 PHP
    关于PHP session 存储方式的详细介绍
    Jun 25 PHP
    PHP实现的MongoDB数据库操作类分享
    May 12 PHP
    PHP使用Session遇到的一个Permission denied Notice解决办法
    Jul 30 PHP
    php中字符集转换iconv函数使用总结
    Oct 11 PHP
    浅谈PHP中foreach/in_array的使用
    Nov 02 PHP
    PHP符合PSR编程规范的实例分享
    Dec 21 PHP
    PHP中Trait及其应用详解
    Feb 14 PHP
    Laravel 5.4重新登录实现跳转到登录前页面的原理和方法
    Jul 13 PHP
    PHP生成(支持多模板)二维码海报代码
    Apr 30 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 socke 向指定页面提交数据
    2008/07/23 PHP
    php遍历目录viewDir函数
    2009/12/15 PHP
    PHP IPV6正则表达式验证代码
    2010/02/16 PHP
    php的日期处理函数及uchome的function_coomon中日期处理函数的研究
    2011/01/12 PHP
    PHP 数据结构 算法 三元组 Triplet
    2011/07/02 PHP
    win7下memCache的安装过程(具体操作步骤)
    2013/06/28 PHP
    php中文字符串截取方法实例总结
    2014/09/30 PHP
    Zend Framework教程之路由功能Zend_Controller_Router详解
    2016/03/07 PHP
    PHP生成图像验证码的方法小结(2种方法)
    2016/07/18 PHP
    PJBlog插件 防刷新的在线播放器
    2006/10/25 Javascript
    jQuery 技巧大全(新手入门篇)
    2009/05/12 Javascript
    javascript setAttribute, getAttribute 在不同浏览器上的不同表现
    2010/08/05 Javascript
    利用jQuery实现可输入搜索文字的下拉框
    2013/10/23 Javascript
    javascript间隔定时器(延时定时器)学习 间隔调用和延时调用
    2014/01/13 Javascript
    归纳下js面向对象的几种常见写法总结
    2016/08/24 Javascript
    react同构实践之实现自己的同构模板
    2019/03/13 Javascript
    Vue强制组件重新渲染的方法讨论
    2020/02/03 Javascript
    wxpython中利用线程防止假死的实现方法
    2014/08/11 Python
    python调用Matplotlib绘制分布点并且添加标签
    2018/05/31 Python
    Python数据分析matplotlib设置多个子图的间距方法
    2018/08/03 Python
    python的sorted用法详解
    2019/06/25 Python
    详解在Python中以绝对路径或者相对路径导入文件的方法
    2019/08/30 Python
    python程序中的线程操作 concurrent模块使用详解
    2019/09/23 Python
    Python新手学习标准库模块命名
    2020/05/29 Python
    Python爬虫爬取新闻资讯案例详解
    2020/07/14 Python
    Pytest测试框架基本使用方法详解
    2020/11/25 Python
    财务会计自荐信范文
    2014/02/21 职场文书
    《雨霖铃》教学反思
    2014/02/22 职场文书
    2014公司党员自我评价范文
    2014/09/11 职场文书
    作风整顿剖析材料
    2014/09/30 职场文书
    毕业生见习报告总结
    2014/11/08 职场文书
    高中生打架检讨书1000字
    2015/02/17 职场文书
    综治目标管理责任书
    2015/05/11 职场文书
    什么是检讨书?检讨书的格式及范文
    2019/11/05 职场文书
    JS监听Esc 键触发事键
    2021/04/14 Javascript
    Redis高级数据类型Hyperloglog、Bitmap的使用
    2021/05/24 Redis