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 相关文章推荐
    第十二节--类的自动加载
    Nov 16 PHP
    PHP 图片上传实现代码 带详细注释
    Apr 29 PHP
    一个基于PDO的数据库操作类(新) 一个PDO事务实例
    Jul 03 PHP
    将word转化为swf 如同百度文库般阅读实现思路及代码
    Aug 09 PHP
    php如何解决无法上传大于8M的文件问题
    Mar 10 PHP
    PHP网页游戏学习之Xnova(ogame)源码解读(十二)
    Jun 25 PHP
    php 流程控制switch的简单实例
    Jun 07 PHP
    PHP面向对象程序设计类的定义与用法简单示例
    Dec 27 PHP
    php微信支付之公众号支付功能
    May 30 PHP
    PHP示例演示发送邮件给某个邮箱
    Apr 03 PHP
    Laravel 不同生产环境服务器的判断实践
    Oct 15 PHP
    PHP safe_mode开启对于PHP系统函数有什么影响
    Nov 10 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中$_SERVER[PHP_SELF] 和 $_SERVER[SCRIPT_NAME]之间的区别
    2009/09/05 PHP
    PHP Memcached应用实现代码
    2010/02/08 PHP
    PHP下通过exec获得计算机的唯一标识[CPU,网卡 MAC地址]
    2011/06/09 PHP
    实用的简单PHP分页集合包括使用方法
    2013/10/21 PHP
    windows7下php开发环境搭建图文教程
    2015/01/06 PHP
    PHP代码优化技巧小结
    2015/09/29 PHP
    PHP实现文件上传下载实例
    2016/10/18 PHP
    javascript 写类方式之八
    2009/07/05 Javascript
    js控制input框只读实现示例
    2014/01/20 Javascript
    Javascript 函数parseInt()转换时出现bug问题
    2014/05/20 Javascript
    ECMAScript6中Set/WeakSet详解
    2015/06/12 Javascript
    jQuery与Ajax以及序列化
    2016/02/01 Javascript
    两种js监听滚轮事件的实现方法
    2016/05/13 Javascript
    Vue.js实现价格计算器功能
    2020/03/30 Javascript
    解决vue.js在编写过程中出现空格不规范报错的问题
    2017/09/20 Javascript
    js正则相关知识点专题
    2018/05/10 Javascript
    [01:05:00]2018国际邀请赛 表演赛 Pain vs OpenAI
    2018/08/24 DOTA
    用python读写excel的方法
    2014/11/18 Python
    Python 专题三 字符串的基础知识
    2017/03/19 Python
    django中的setting最佳配置小结
    2017/11/21 Python
    Python Django基础二之URL路由系统
    2019/07/18 Python
    如何通过Python3和ssl实现加密通信功能
    2020/05/09 Python
    属性与 @property 方法让你的python更高效
    2020/09/21 Python
    Myprotein蛋白粉美国官网:欧洲畅销运动营养品牌
    2016/11/15 全球购物
    CSS代码检查工具stylelint的使用方法详解
    2021/03/27 HTML / CSS
    纠风工作实施方案
    2014/03/15 职场文书
    体育口号大全
    2014/06/18 职场文书
    银行柜员求职自荐书
    2014/06/18 职场文书
    ktv好的活动方案
    2014/08/17 职场文书
    2014年效能监察工作总结
    2014/11/21 职场文书
    2015年调度员工作总结
    2015/04/30 职场文书
    小学三年级班主任工作经验交流材料
    2015/11/02 职场文书
    PostGIS的安装与入门使用指南
    2022/01/18 PostgreSQL
    Python中re模块的元字符使用小结
    2022/04/07 Python
    delete in子查询不走索引问题分析
    2022/07/07 MySQL
    Windows server 2016服务器基本设置
    2022/08/14 Servers