Неопределенная ошибка переменной при расширении макетов - PullRequest
0 голосов
/ 05 октября 2019

Я создал макет с именем front, в котором определены меню и нижний колонтитул! Передний макет содержит пункты меню из контроллера меню.

Вот мой контроллер меню -

$menu = Menu::all();
/* some other long code */

Теперь я пытаюсь расширить макеты, используя @extends('front') на странице сообщений.

Возвращает следующую ошибку:

"Undefined variable: menus" in View: C:\xxxxx\layouts\front.blade.php. 

Я знаю, что это можно исправить с помощью $menu = Menu::all(); в контроллере сообщений.

Так как приложение огромно, и я не могу продолжать вставлять код контроллера меню в каждое расширенное представление.

Как сделать код контроллера меню глобальным, чтобы всякий раз, когда я расширял передние макеты, он не давал мне неопределенную ошибку переменной?

Ответы [ 3 ]

1 голос
/ 05 октября 2019

Вы можете использовать составители представлений, чтобы сделать переменную доступной для нескольких представлений

В вашей app/Providers/AppServiceProvider.php загрузочной функции

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    view()->composer(['first.view', 'second.view', 'another.view'], function ($view) {
        return $view->with('menus', App\Menu::all());
    });
}

А чтобы сделать переменную доступной везде, используйте * подстановочный знак вместо

/**
 * Bootstrap any application services.
 *
 * @return void
 */
public function boot()
{
    view()->composer('*', function ($view) {
        return $view->with('menus', App\Menu::all());
    });
}
0 голосов
/ 05 октября 2019

Если эта переменная нужна только макету, вы можете использовать компоновщик представлений для макета, чтобы передать необходимую переменную.

// a service provider @ boot

View::composer('layouts.front', function ($view) {
    $menus = Menu::all();
    ...
    $view->with('menus', $menus);
});

Документы Laravel 6.0 - Представления - Просмотр композиторов

0 голосов
/ 05 октября 2019

Посмотрите комментарий @ Watercayman под вашим вопросом. Но я думаю, что вам нужно ниже:

Вам нужно показать свою переменную в блейде, куда вы не отправили с контроллера. В таких ситуациях вы можете использовать функцию «поделиться» из «Освещение \ Поддержка \ Фасады \ Вид». Вы можете просто поделиться своей переменной из конструктора главного контроллера (это может быть как «App \ Http \ Controllers \ Controller» или другой, если она заботится обо всех страницах, которые используют $ menu), например:

use Illuminate\Support\Facades\View;

public function __construct()
{
    // here you can write some global things for all controllers which extending from this
    $menu = Menu::all();
    View::share('menu', $menu);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...