Laravel 5 多个视图共享数据的方法
推荐

Laravel 5 多个视图共享数据的方法
我们都知道模板一般会用到继承,导航栏就是一个很好的例子,但是导航栏的数据如何共享,比如有个导航的文件叫在view/navigation.blade.php

我们都知道模板一般会用到继承,导航栏就是一个很好的例子,但是导航栏的数据如何共享,比如有个导航的文件叫在view/navigation.blade.php

为了简单一点,文件里只有设置了一个变量

{{ $cqh }}

现在的要求是每个页面都会用到这个变量,如何共享这个数据呢?

一般这样的操作我会在Laravel服务的boot方法里设置,下面介绍两种共享数据的方法

方法一:使用View:share方法,如CqhServiceProvider里

public function boot()
  {
    View::share('cqh','chenqionghe');
  }
这是使用外观模式,也可以直接使用view()方法,
view()->share('cqh', 'chenqionghe');
方法二:使用composer方法单独对这个navigation.blade.php进行传送数据,方法如下
public function boot()
  {
    view()->composer('navigation', function ($view) {
      $view->with('cqh','chenqionghe');
    });
  }
以上是使用 闭包 的形式来完成这个操作,其实这和路由一样,也可以用类来代替,Laravel里叫 组件 ,方法如下
public function boot()
  {
    View::composer('navigation', 'App\Http\ViewComposers\MyViewComposer');
  }

上面这样就是注册了视图组件,并且在每次 navigation视图渲染的时候,MyViewComposer@compose 都将会被执行。

下面我们来看这个组件怎么定义

<?php namespace App\Http\ViewComposers;
use Illuminate\Contracts\View\View;
class MyViewComposer
{
    public function compose(View $view)
    {
        $view->with('cqh','chenqionghe');
    }
}

在视图被渲染之前,视图组件的 compose 方法就会被调用,并且传入一个 Illuminate\Contracts\View\View 实例。你可以使用 with 方法来把数据绑定到 view。

注意 :方法一和方法二其实是有区别的,方法一是对所有的视图都传递的cqh数据,而方法二只是对navigation视图传递了cqh数据

如果方法二要达到方法一的效果,可以这样

View::composer('*', function($view)
{
    //
});

这样就会对所有视图进行传递了

也可以针对多个视图指定MyViewComposer组件

View::composer(['navigation', 'footer'], 'App\Http\ViewComposers\MyViewComposer');
也可以使用 composers 方法来同时定义一群视图组件
View::composers([
    'App\Http\ViewComposers\AdminComposer' => ['admin.index', 'admin.profile'],
    'App\Http\ViewComposers\UserComposer' => 'user',
    'App\Http\ViewComposers\ProductComposer' => 'product'
]);

版权属于:够过瘾——挨踢男的葵花宝典

文章标签:laravel

文章链接:http://www.gouguoyin.cn/php/77.html

转载时必须以链接形式注明原始出处及本声明。

如果您觉得本文对您有所帮助,请小额赞助一下,我会优先回答您在使用过程中出现的问题,点此赞助

如有疑问或遇到技术问题,请加官方QQ群: 421537504   GoCMS官方交流群

文章点评:

表情

3条评论