网站一般都有侧栏,用来显示分类,标签,热门文章,热门评论啥的,但是这些侧栏都是相对独立的模块,如果在每一个引入侧栏的视图中都单独导入与视图有关的数据的话,未免太冗余了。。。
所以最佳的做法是:新建一个 widgets 视图文件夹,再利用 Laravel 的 ViewComposers 单独为侧栏绑定数据,这样侧栏就可以随便引入而不用关心数据是否绑定啦~~~
我们先创建一个 ViewComposer 类,通常放在 app/Http/ViewComposers
目录下:
mkdir -p app/Http/ViewComposers
touch app/Http/ViewComposers/CategoryTreeComposer.php
<?php
namespace App\Http\ViewComposers;
use App\Services\CategoryService;
use Illuminate\View\View;
class CategoryTreeComposer
{
protected $categoryService;
// 使用 Laravel 的依赖注入,自动注入我们所需要的 CategoryService 类
public function __construct(CategoryService $categoryService)
{
$this->categoryService = $categoryService;
}
// 当渲染指定的模板时,Laravel 会调用 compose 方法
public function compose(View $view)
{
// 使用 with 方法注入变量
$view->with('categoryTree', $this->categoryService->getCategoryTree());
}
}
定义好 ViewComposer 之后我们还需要告诉 Laravel 要把这个 ViewComposer 应用到哪些模板文件里:
app/Providers/AppServiceProvider.php
public function boot()
{
// 当 Laravel 渲染 products.index 和 products.show 模板时,就会使用 CategoryTreeComposer 这个来注入类目树变量
// 同时 Laravel 还支持通配符,例如 products.* 即代表当渲染 products 目录下的模板时都执行这个 ViewComposer
View::composer(['products.index', 'products.show'], \App\Http\ViewComposers\CategoryTreeComposer::class);
}
注意:ViewComposers的方法名是compose,provider中view::composer
可以参考中文文档的视图合成器