laravel ViewComposer | 全局视图变量
2018年12月18日Laravel 提供了一个叫做 ViewComposer 的解决方案,ViewComposer 可以在不修改控制器的情况下直接向指定的模板文件注入变量。
1.创建ViewComposer
我们先创建一个 ViewComposer 类,通常放在 app/Http/ViewComposers
目录下:
1 2 |
$ mkdir -p app/Http/ViewComposers $ touch app/Http/ViewComposers/CategoryTreeComposer.php |
2.编写创建的CategoryTreeComposer
类
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
<?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()); } } |
3注册app/Providers/AppServiceProvider.php
1 2 3 4 5 6 7 8 9 10 11 |
/** * Bootstrap any application services. * * @return void */ public function boot() { // 当 Laravel 渲染 products.index 和 products.show 模板时,就会使用 CategoryTreeComposer 这个来注入类目树变量 // 同时 Laravel 还支持通配符,例如 products.* 即代表当渲染 products 目录下的模板时都执行这个 ViewComposer \View::composer(['products.index', 'products.show'], \App\Http\ViewComposers\CategoryTreeComposer::class); } |
这样就可以变量共享了