您现在的位置是:网站首页 > 心得笔记
laravel框架中视图合成器的使用
例如:我整个博客项目中很多地方都在使用数据博客名称、备案号等公共的信息。如果不使用试图合成器,我们要做的就是在需要显示的地方查一次数据。这样,造成了代码复用!
但是,如果我使用了视图合成器,那效果是完全不一样的,下面我将详细讲述我使用试图合成器的流程,希望对你有所帮助!
1、注册视图合成器
使用 View Facade 来访问底层的 Illuminate\Contracts\View\Factory 契约实现
<?php namespace App\Providers; use Illuminate\Support\Facades\View; use Illuminate\Support\ServiceProvider; class ComposerServiceProvider extends ServiceProvider { /** * 在容器中注册绑定。 * * @return void */ public function boot() { // 使用基于类的 composer... View::composer( ['/front/index/app','front/notes/index','front/post/index'], 'App\ViewComposers\SiteComposer' ); // 使用基于闭包的 composers... View::composer('dashboard', function ($view) { // }); } /** * 注册服务器提供者。 * * @return void */ public function register() { // } }
注意,这里我创建了新的一个服务提供器来存放我视图合成器的代码,所以我还需要将这个服务提供器添加到配置文件 config/app.php 的 providers 数组中。!!!
'providers' => [ App\Providers\ComposerServiceProvider::class, ],
到此我们已经注册了视图合成器,每次渲染 '/front/index/app','front/notes/index','front/post/index' 视图时都会执行 SiteComposer@compose 方法。那么下面我们来定义视图合成器的这个类吧:
2、定义视图合成器类
默认情况下,Laravel 没有存放视图合成器的目录,你需要根据喜好来重新建立目录,例如我这里建立的目录:App\ViewComposers。
<?php namespace App\ViewComposers; use Illuminate\View\View; use App\Model\Admin\Site; class SiteComposer { protected $site; public function __construct(Site $site) { // 依赖关系由服务容器自动解析... $this->site = $site; } /** * 将数据绑定到视图。 * * @param View $view * @return void */ public function compose(View $view) { $view->with('site', $this->site->getFirstCached());//查取需要显示的数据绑定到视图,视图中通过$site便可获取数据 } }
App\Model\Site.php中获取数据的方法:
public function getFirstCached() { // 尝试从缓存中取出 cache_key 对应的数据。如果能取到,便直接返回数据。 // 否则运行匿名函数中的代码来取出活跃用户数据,返回的同时做了缓存。 return Cache::remember($this->cache_key, $this->cache_expire_in_minutes, function(){ return $this->first(); }); }
视图合成器的 compose 方法会在视图渲染之前被调用,并传入一个 Illuminate\View\View 实例。你可以使用 with 方法将数据绑定到视图。
我上面是将视图构造器添加到多个视图,通过将一组视图作为第一个参数传入 composer 方法,将一个视图合成器添加到多个视图:
// 使用基于类的 composer... View::composer( ['/front/index/app','front/notes/index','front/post/index'], 'App\ViewComposers\SiteComposer' );
如果你查询的数据只在一个视图中显示:
// 使用基于类的 composer... View::composer( '/front/index/app','App\ViewComposers\SiteComposer' );
composer 方法同时也接受通配符 *,表示将一个视图合成器添加到所有视图:
// 使用基于类的 composer... View::composer( '*', 'App\ViewComposers\SiteComposer' });
上一篇:获取两个日期相差年、月、日