当前位置:首页 > 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.    * Bootstrap any application services. 
  7.    * 
  8.    * @return void 
  9.    */ 
  10.   public function boot() 
  11.   { 
  12.     //视图间共享数据 
  13.     view()->share('name','高伟'); 
  14.   } 
  15.   /** 
  16.    * Register any application services. 
  17.    * 
  18.    * @return void 
  19.    */ 
  20.   public function register() 
  21.   { 
  22.     // 
  23.   } 

接下来我直接用一个空的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.    * @date  2018-01-13 
  11.    * @author 高伟 
  12.    * @param View    $view [description] 
  13.    * @return [type]      [description] 
  14.    */ 
  15.   public function compose(View $view
  16.   { 
  17.     $view->with('motto''嘎嘎嘎,我一直在努力!'); 
  18.   } 

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

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

在视图中显示共享数据:

  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.    * Bootstrap any application services. 
  7.    * 
  8.    * @return void 
  9.    */ 
  10.   public function boot() 
  11.   { 
  12.     view()->share('name','高伟'); 
  13.     // 使用基于类的composers... 
  14.     view()->composer( 
  15.       'welcome''App\Http\ViewComposers\MottoComposer' 
  16.     ); 
  17.     // 闭包实现方式 
  18.     view()->composer('*',function($view
  19.     { 
  20.       $view->with('info','http://www.phpfensi.com'); 
  21.     }); 
  22.   } 
  23.   /** 
  24.    * Register any application services. 
  25.    * 
  26.    * @return void 
  27.    */ 
  28.   public function register() 
  29.   { 
  30.     // 
  31.   } 

视图中显示数据:

  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共享数据

分享到: