Делитесь данными со всеми мнениями, лучшими практиками

#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.blade.php у меня есть это: @yield('content')
к сожалению, переменная $categories отсутствует в том содержимом, которое включено. Как я могу это изменить?

Ошибка: Undefined variable: categories

Я пытался:

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

но это дает ошибку htmlspecialchars() expects parameter 1 to be string, array given

Ответ №1:

Если вы используете view()->creator('layouts.app') , каждая переменная, которой вы делитесь в этом обратном вызове, будет доступна только для layouts.app представления и любых представлений, которые layouts.app включают.

Если вы используете @extends , например, новое представление, называемое example.blade.php расширением layouts.app @extends('layouts.app'), the категорий использования variable will not be accessible in extends.blade.php view, since you said to laravel to share that variable only with макеты. 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 .

 view()->creator('welcome', function($view) {
    view()->share('post', Post::first());
});
 

Это результат в моем браузере:

введите описание изображения здесь

Комментарии:

1. хорошо, вы включили этот тест, но можете ли вы получить доступ к сообщению в @yield(«сообщение») ?

2. Да, @section('post') не будет видно, пока я не использую @yield директиву. Идентификатор поста: 1 тест исходит из этого результата.

3. @PHPisMyPassion можете ли вы добавить свои мнения к вопросу? Может быть, это помогает понять, что происходит.