在实际的开发中我们,我们常常会遇到需要在多个页面共享数据的情况,在 laravel
中视图合成器 ViewComposers
和视图共享器可以轻松的帮助我们做到这一点。
在 laravel 中你可以在 AppServiceProvider 的 boot 方法中调用 View::share('key', 'value');,向所有的视图中共享一些简单的数据,也可以使用视图合成器和视图共享器向特定的组建中注入共享数据。而视图合成器和视图共享器的使用并没有太大的差别,唯一不同的是视图共享器在实例创建时候立即被调用,而视图合成器则是在视图将要渲染的时候调用。
关于视图合成器 Laravel 官方给出的解释是:视图合成器是在渲染视图时调用的回调或者类方法。本文也将重点基于视图合成器来介绍 laravel 的多视图数据共享。
- 使用 php artisan make:provider TagsServicePorvider 创建服务提供者,并将 TagsServicePorvider 加入到 app 的服务提供者之中。创建好的代码如下
php
class TagsServiceProvider extends ServiceProvider
{
/**
* 注册共享的视图和数据
* @return void
*/
public function boot()
{
//共享数据至单个视图
View::composer(
'layouts.app', TagsComposer::class
);
//共享数据至多个视图
View::composer(
['layouts.app','layout.login'], TagsComposer::class
);
//共享数据至所有视图
View::composer('*', TagsComposer::class
);
}
}
- 在 app 下创建 ViewComposers 目录,并创建 TagsComposer 文件,填充需要共享的数据
php
/**
* 共享数据的获取
* TagsComposer constructor.
* @param Tags $tags
*/
public function __construct(Tags $tags)
{
$this->tags = $tags->take(20)->get();
}
/**
* 视图合成器默认调用的方法
* @date: 2018/8/1 15:56
* @param View $view
*/
public function compose(View $view)
{
//设置共享数据的对象别名
$view->with('tags', $this->tags);
}
- 在视图中使用被共享的数据。 在经过上述操作之后,数据将成功的被共享到指定的视图和视图组中,在指定视图中你将能够像处理普通视图数据一样处理被共享的数据。
php
@if(!$tags->isEmpty())
<div class="hot-tag back-ground-color ">
<div class="tag-title">
<div class="left">热门标签</div>
<div class="right"><a href="%7B%7B%20url('/tags')%20%7D%7D">更多>></a></div>
</div>
<hr><div class="tag-content">
@foreach($tags as $tag)
<a class="tag" href="%7B%7B%20url(">id]) }}">{{ $tag->tag_name }}</a>
@endforeach
</div>
</div>
@endif
- 视图共享器共享数据
php
View::creator('tags', 'App\Http\ViewCreators\TagsCreator');