在实际的开发中我们,我们常常会遇到需要在多个页面共享数据的情况,在 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');