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

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

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

在视图中共享数据

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

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

  <?php  namespace AppProviders;  use IlluminateSupportServiceProvider;  class AppServiceProvider extends ServiceProvider  {    /**     * Bootstrap any application services.     *     * @return void     */    public function boot()    {      //视图间共享数据      view()->share('name','高伟');    }    /**     * Register any application services.     *     * @return void     */    public function register()    {      //    }  }    

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

  Route::get('/', function () {    return view('welcome');  });    

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

  <!DOCTYPE html>  <html>    <head>      <title>Laravel</title>      <style>        html, body {          height: 100%;        }        body {          margin: 0;          padding: 0;          width: 100%;          display: table;          font-weight: 100;          font-family: 'Lato';        }        .container {          text-align: center;          display: table-cell;          vertical-align: middle;        }        .content {          text-align: center;          display: inline-block;        }        .title {          font-size: 96px;        }      </style>    </head>    <body>      <div class="container">        <div class="content">          <div class="title">Laravel 5</div>          <h1>hello,{{$name}}</h1>        </div>      </div>    </body>  </html>    

视图Composer

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

控制器的动作方式

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

  <?php  namespace AppHttpViewComposers;  use IlluminateContractsViewView;  /**  * 基于类的实现方式  */  class MottoComposer  {    /**     * 共享数据     * @date  2018-01-13     * @author 高伟     * @param View    $view [description]     * @return [type]      [description]     */    public function compose(View $view)    {      $view->with('motto', '嘎嘎嘎,我一直在努力!');    }  }    

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

  <?php  namespace AppProviders;  use IlluminateSupportServiceProvider;  class AppServiceProvider extends ServiceProvider  {    /**     * Bootstrap any application services.     *     * @return void     */    public function boot()    {      view()->share('name','高伟');      // 使用基于类的composers...第一个参数可以指定共享给那个视图,多个视图用数组,共享到全部视图可以用 *      view()->composer(        'welcome', 'AppHttpViewComposersMottoComposer'      );    }    /**     * Register any application services.     *     * @return void     */    public function register()    {      //    }  }    

在视图中显示共享数据:

  ...  <div class="content">   <div class="title">Laravel 5</div>   <h1>hello,{{$name}}</h1>   <p>{{$motto}}</p>  </div>  ...    

闭包实现方式

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

  <?php  namespace AppProviders;  use IlluminateSupportServiceProvider;  class AppServiceProvider extends ServiceProvider  {    /**     * Bootstrap any application services.     *     * @return void     */    public function boot()    {      view()->share('name','高伟');      // 使用基于类的composers...      view()->composer(        'welcome', 'AppHttpViewComposersMottoComposer'      );      // 闭包实现方式      view()->composer('*',function($view)      {        $view->with('info','http://www.iwanli.me');      });    }    /**     * Register any application services.     *     * @return void     */    public function register()    {      //    }  }    

视图中显示数据:

  ...  <div class="content">   <div class="title">Laravel 5</div>   <h1>hello,{{$name}}</h1>   <p>{{$motto}}</p>   <p>{{$info}}</p>  </div>  ...    

希望本文所述对大家基于Laravel框架的PHP程序设计有所帮助。

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

郑重声明:本网站发布的内容(图片、视频和文字)以及用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服