当前位置:首页 > CMS教程 > 其它CMS > 列表

Laravel框架实现多个视图共享相同数据的方法详解

发布:smiling 来源: PHP粉丝网  添加日期:2021-12-03 16:40:43 浏览: 评论:0 

这篇文章主要介绍了Laravel框架实现多个视图共享相同数据的方法,涉及Laravel框架视图与控制器数据调用相关操作技巧,需要的朋友可以参考下。

本文实例讲述了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,最后将数据塞到视图中。

基类

  1. class BaseController{ 
  2.   protected $menu = null;//菜单数据 
  3.   public function __construct(){ 
  4.     $this->getMenu();//获取导航菜单 
  5.   } 
  6.   public function getMenu(){ 
  7.     $this->menu = DB::table('menu')->get(); 
  8.   } 

A控制器

  1. class AController extends BaseController{ 
  2.   public function index(){ 
  3.     return view('admin.index',['menu'=>$this->menu,'user'=>$user]); 
  4.   } 

缺点:在每个控制器中都需要重新设置相同的模板的数据(menu)

最好优化方案

使用Laravel中的View Composers来解决这个问题

1、在App\Providers下创建一个ComposerServiceProvider类

  1. <?php 
  2. namespace App\Providers; 
  3. use Illuminate\Support\Facades\View; 
  4. use Illuminate\Support\ServiceProvider; 
  5. class ComposerServiceProvider extends ServiceProvider { 
  6.   /** 
  7.    * Register bindings in the container. 
  8.    * 
  9.    * @return void 
  10.    */ 
  11.   public function boot() { 
  12.     // 基于类的view composer 
  13.     View::composer( 
  14.       'admin.common.*''App\Http\ViewComposers\AdminComposer' 
  15.     ); 
  16.   } 
  17.   /** 
  18.    * Register the service provider. 
  19.    * 
  20.    * @return void 
  21.    */ 
  22.   public function register() { 
  23.     // 
  24.   } 

在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目录下,这个目录一开始是没有的,需要新建

  1. <?php 
  2. namespace App\Http\ViewComposers; 
  3. use App\Libs\CommonUtils; 
  4. use Illuminate\Http\Request; 
  5. use Illuminate\View\View; 
  6. class AdminComposer { 
  7.   private $data = null;//CommonUtils对象 
  8.   public function __construct(Request $request) { 
  9.     $this->data = new CommonUtils($request);//新建一个CommonUtils对象 
  10.   } 
  11.   public function compose(View $view) { 
  12.     $view->with([ 
  13.       'admin' => $this->data->admin, 
  14.       'mbx' => $this->data->mbx, 
  15.       'menu' => $this->data->menu, 
  16.       'msg' => $this->data->msg 
  17.     ]);//填充数据 
  18.   } 

在这里我在构造方法中创建了一个对象,这个对象中包含着数据

5、CommonUtils文件

  1. <?php 
  2. /** 
  3.  * Created by PhpStorm. 
  4.  * User: Administrator 
  5.  * Date: 2017/4/20 0020 
  6.  * Time: 19:49 
  7.  */ 
  8. namespace App\Libs; 
  9. use App\Admin; 
  10. use App\Perm; 
  11. use Illuminate\Http\Request; 
  12. use Illuminate\Support\Facades\DB; 
  13. class CommonUtils { 
  14.   public $admin = null;//管理员对象 
  15.   public $menu = null;//菜单对象 
  16.   public $mbx = null;//面包屑对象 
  17.   public $msg = null;//消息对象 
  18.   /** 
  19.    * 构造函数 
  20.    */ 
  21.   public function __construct(Request $request) { 
  22.     $this->init($request); 
  23.   } 
  24.   /** 
  25.    * 初始化函数 
  26.    */ 
  27.   private function init(Request $request) { 
  28.     $this->getAdmin($request); 
  29.     $this->getMsg(); 
  30.     $this->getMenu($request); 
  31.     $this->getMbx($request); 
  32.   } 
  33.   /** 
  34.    * 获取管理员数据 
  35.    */ 
  36.   private function getAdmin() { 
  37.     $this->admin = session('admin'); 
  38.   } 
  39.   /** 
  40.    * 获取后台菜单数据 
  41.    */ 
  42.   private function getMenu(Request $request) { 
  43.     $menu = DB::table('menu')->where('parentid', 0)->orderBy('sort')->get(); 
  44.     $router = $request->getPathInfo(); 
  45.     $perm = new Perm(); 
  46.     $mbx = $perm->getMbx($router); 
  47.     foreach ($menu as $k => $m) { 
  48.       $m->active = ''
  49.       //读取子菜单 
  50.       $childMenu = DB::table('menu')->where('parentid'$m->id)->orderBy('sort')->get(); 
  51.       if (count($childMenu) > 0) { 
  52.         foreach($childMenu as $v){ 
  53.           $v->active = ''
  54.           if($mbx[0]->router == $v->router){ 
  55.             $v->active = 'active'
  56.             $m->active = 'active'
  57.           } 
  58.         } 
  59.         $m->childMenu = $childMenu
  60.       } else { 
  61.         $m->childMenu = null; 
  62.       } 
  63.     } 
  64.     $this->menu = $menu
  65.   } 
  66.   /** 
  67.    * 获取面包屑 
  68.    */ 
  69.   private function getMbx(Request $request) { 
  70.     $router = $request->getPathInfo(); 
  71.     $perm = new Perm(); 
  72.     $mbx = $perm->getMbx($router); 
  73.     $this->mbx = $mbx
  74.   } 
  75.   /** 
  76.    * 获取未读消息 
  77.    */ 
  78.   private function getMsg() { 
  79.     $adminModel = new Admin(); 
  80.     $toId = $this->admin->id; 
  81.     $this->msg = $adminModel->getUnReadMsg($toId); 
  82.   } 

在这里面分别获取了管理员、菜单、面包屑、消息数据,这些数据都是每个后台页面都要使用到的。

注意:这里我将类定义成了CommonUtils,感觉名字取得不好,CommonUtils是存放在App\Libs下的,这个Libs文件夹是我新建的,用于存放工具类的。如果需要给App\Libs文件夹添加自动加载,需要在composer.json文件里做如下修改。

Laravel视图共享

Tags: Laravel视图共享

分享到: