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

Laravel5.4框架中视图共享数据的方法详解

发布:smiling 来源: PHP粉丝网  添加日期:2021-12-15 10:12:27 浏览: 评论:0 

本文实例讲述了Laravel5.4框架中视图共享数据的方法,分享给大家供大家参考,具体如下:

每个人都会遇到这种情况:某些数据还在每个页面进行使用,比如用户信息,或者菜单数据,最基本的做法是在每个视图空控制器中传入这些数据,但显然并不是我们想要的结果。另一种方法就是使用视图数据共享,视图数据共享的基本使用很简单,可查看视图文档了解详情,这里我们演示两个使用示例:在视图间共享数据和视图Composer

在视图中共享数据

除了在单个视图中传递指定数据之外,有时候需要在所有视图中传入同一数据,即我们需要在不同视图中共享数据。要实现这一目的,需要使用视图工厂的share方法。

全局帮助函数view和response类似,如果传入参数,则返回Illuminate\View\View实例,不传入参数则返回Illuminate\View\Factory实例。所以我们可以通过在服务提供者的boot方法中使用如下方式实现视图间共享数据:

  1. <?php 
  2. namespace App\Providers; 
  3. use Illuminate\Support\ServiceProvider; 
  4. class AppServiceProvider extends ServiceProvider 
  5. { 
  6.   /** 
  7.    * Bootstrap any application services. 
  8.    * 
  9.    * @return void 
  10.    */ 
  11.   public function boot() 
  12.   { 
  13.     //视图间共享数据 
  14.     view()->share('name','高伟'); 
  15.   } 
  16.   /** 
  17.    * Register any application services. 
  18.    * 
  19.    * @return void 
  20.    */ 
  21.   public function register() 
  22.   { 
  23.     // 
  24.   } 
  25. } 

接下来我直接用一个空的Laravel项目做演示,我们在 routes 文件首页(welcome.blade.php)视图:

  1. Route::get('/', function () { 
  2.   return view('welcome'); 
  3. }); 

然后在视图中输出视图共享数据:

  1. <!DOCTYPE html> 
  2. <html> 
  3.   <head> 
  4.     <title>Laravel</title> 
  5.     <style> 
  6.       html, body { 
  7.         height: 100%; 
  8.       } 
  9.       body { 
  10.         margin: 0; 
  11.         padding: 0; 
  12.         width: 100%; 
  13.         display: table; 
  14.         font-weight: 100; 
  15.         font-family: 'Lato'; 
  16.       } 
  17.       .container { 
  18.         text-align: center; 
  19.         display: table-cell; 
  20.         vertical-align: middle; 
  21.       } 
  22.       .content { 
  23.         text-align: center; 
  24.         display: inline-block; 
  25.       } 
  26.       .title { 
  27.         font-size: 96px; 
  28.       } 
  29.     </style> 
  30.   </head> 
  31.   <body> 
  32.     <div class="container"> 
  33.       <div class="content"> 
  34.         <div class="title">Laravel 5</div> 
  35.         <h1>hello,{{$name}}</h1> 
  36.       </div> 
  37.     </div> 
  38.   </body> 
  39. </html> 

视图Composer

上面的一种做法虽然可行,但是在别人下载项目后,共享数据是从数据库中获取的,执行数据迁移的时候会报错。这时候我们就要用到视图Composer,视图Composer通过视图工厂的composer方法实现。该方法的第二个回调参数支持基于控制器动作和闭包函数两种方式。

控制器的动作方式

首先要在服务提供者中注册视图 Composer,我们将会使用辅助函数 view 来访问 Illuminate\Contracts\View\Factory 的底层实现,记住,Laravel 不会包含默认的视图 Composer 目录,我们可以按照自己的喜好组织其路径,例如可以创建一个 App\Http\ViewComposers 目录:

  1. <?php 
  2. namespace App\Http\ViewComposers; 
  3. use Illuminate\Contracts\View\View; 
  4. /** 
  5. * 基于类的实现方式 
  6. */ 
  7. class MottoComposer 
  8. { 
  9.   /** 
  10.    * 共享数据 
  11.    * @date  2018-01-13 
  12.    * @author 高伟 
  13.    * @param View    $view [description] 
  14.    * @return [type]      [description] 
  15.    */ 
  16.   public function compose(View $view) 
  17.   { 
  18.     $view->with('motto', '嘎嘎嘎,我一直在努力!'); 
  19.   } 
  20. } 

然后我们在 AppServiceProvider 中继续添加共享数据:

  1. <?php 
  2. namespace App\Providers; 
  3. use Illuminate\Support\ServiceProvider; 
  4. class AppServiceProvider extends ServiceProvider 
  5. { 
  6.   /** 
  7.    * Bootstrap any application services. 
  8.    * 
  9.    * @return void 
  10.    */ 
  11.   public function boot() 
  12.   { 
  13.     view()->share('name','高伟'); 
  14.     // 使用基于类的composers...第一个参数可以指定共享给那个视图,多个视图用数组,共享到全部视图可以用 * 
  15.     view()->composer( 
  16.       'welcome', 'App\Http\ViewComposers\MottoComposer' 
  17.     ); 
  18.   } 
  19.   /** 
  20.    * Register any application services. 
  21.    * 
  22.    * @return void 
  23.    */ 
  24.   public function register() 
  25.   { 
  26.     // 
  27.   } 
  28. } 

在视图中显示共享数据:

  1. ... 
  2. <div class="content"> 
  3.  <div class="title">Laravel 5</div> 
  4.  <h1>hello,{{$name}}</h1> 
  5.  <p>{{$motto}}</p> 
  6. </div> 
  7. ... 

闭包实现方式

闭包的实现方式相对来说简单很多,这里就简单贴书代码:

  1. <?php 
  2. namespace App\Providers; 
  3. use Illuminate\Support\ServiceProvider; 
  4. class AppServiceProvider extends ServiceProvider 
  5. { 
  6.   /** 
  7.    * Bootstrap any application services. 
  8.    * 
  9.    * @return void 
  10.    */ 
  11.   public function boot() 
  12.   { 
  13.     view()->share('name','高伟'); 
  14.     // 使用基于类的composers... 
  15.     view()->composer( 
  16.       'welcome', 'App\Http\ViewComposers\MottoComposer' 
  17.     ); 
  18.     // 闭包实现方式 
  19.     view()->composer('*',function($view) 
  20.     { 
  21.       $view->with('info','http://www.phpfensi.com'); 
  22.     }); 
  23.   } 
  24.   /** 
  25.    * Register any application services. 
  26.    * 
  27.    * @return void 
  28.    */ 
  29.   public function register() 
  30.   { 
  31.     // 
  32.   } 
  33. } 

视图中显示数据:

  1. ... 
  2. <div class="content"> 
  3.  <div class="title">Laravel 5</div> 
  4.  <h1>hello,{{$name}}</h1> 
  5.  <p>{{$motto}}</p> 
  6.  <p>{{$info}}</p> 
  7. </div> 
  8. ...

Tags: Laravel5 4共享数据

分享到: