#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 можете ли вы добавить свои мнения к вопросу? Может быть, это помогает понять, что происходит.