与所有视图共享数据,最佳实践

时间:2021-04-13 15:08:20

标签: laravel laravel-8

我使用 AppServiceProvider 获取页面上的所有类别。

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     *
     * @return void
     */
    public function register() {}

    /**
     * Bootstrap any application services.
     *
     * @return void
     */
    public function boot()
    {
        view()->creator('layouts.app', function($view) {

            //Categories cache
            $categories = Cache::rememberForever('categories', function () {
                return Category::where("parent_id", "=", null)->with('subcategory.subcategory')->get();
            });
            view()->share('categories', $categories);
            
        });
    }
}

数据可在主 layouts.app 视图中访问,但不能在其包含的视图中访问。 所以在我的 layouts/app.blade.php 我有这个:@yield('content') 遗憾的是,包含的内容中不存在变量 $categories。怎么改?

错误:Undefined variable: categories <- 但仅在使用该变量的页面上,它可以在 app.blade.php 上访问,我在其中显示类别,但不能在它包含的视图中访问

我试过了:

@yield('content', ['categories' => $categories])

但它给出了错误 htmlspecialchars() expects parameter 1 to be string, array given

1 个答案:

答案 0 :(得分:0)

如果您使用 view()->creator('layouts.app'),则您在该回调中共享的每个变量将仅与 layouts.app 视图和 layouts.app 包含的任何视图共享。

例如,如果您使用 @extends,名为 example.blade.php 的新视图使用 layouts.appcategories@extends('layouts.app'), the extends.blade.php{{ 扩展 variable will not be accessible in 1}}layouts.appview, since you said to laravel to share that variable only withview()->creator()` 方法。

via 指令用于显示给定部分的内容。

示例: 我的 @yield 视图包含以下内容:

inc.test

我的 <br> view `test` included. <br> @section('post') Post id: {{ $post->id }} test @endsection 视图包含 welcome.blade.php 并生成 inc.test 部分,具有以下内容:

post

由于我通过服务提供商与 This is the welcome view. <br> It has a `post` variable shared via AppServiceProvider. <br> <br> <br> Here i'm including 'inc.test' view and yielding the post section from that view: <br> <br> @include('inc.test') @yield('post') 视图共享了 post 变量,因此它可用于 welcome 包含的所有视图。

welcome

这是我浏览器中的结果:

enter image description here