Laravel, переменный вывод работает с View::share, но не с VIew::composer

StackOverflow https://stackoverflow.com//questions/21007892

  •  21-12-2019
  •  | 
  •  

Вопрос

Мне нужно одно и то же меню во всех моих представлениях.

Итак, я получаю данные, необходимые для вывода меню, в конструкторе, определенном в моем BaseController.

Чтобы получить данные, я сначала попытался использовать View::composer, но не знаю, почему я не получаю никаких ошибок, похоже, View::composer вообще не выполняется...

Если я использую View::share, все работает

//Базовыйконтроллер.php

//function called in the constructor
public function init()
{
    $envs = $this->game->environments()->get();

    View::share('test', $envs);

    View::composer('layouts.base', function($view)
    {
        $view->with('envs', $envs);
    });
}

//base.twig

//nothing output here, no error
{% for env in envs %}
         {{ env.name }}
{% endfor %}

//its work
{% for env in test %}
         {{ env.name }}
{% endfor %}

Я новичок в Laravel, может быть, я что-то пропустил?

Это было полезно?

Решение

Я думаю, что причина, по которой это не работает, заключается в том, где вы поместили View Composer в свой код.Компоновщики представлений в Laravel — это, по сути, обратные вызовы, которые выполняются сразу после визуализации представления.Где это init() функция определена?Я предполагаю, что представление создается до ваш композитор представления определен - это означает, что обратный вызов композитора представления никогда не будет выполнен.

Попробуйте переместить весь блок композитора представления из init() функцию и добавьте ее в конец файла Routes.php и посмотрите, работает ли она.Это неплохое место для размещения ваших композиторов представлений, если у вас их не слишком много. Если у вас есть, вы можете создать новый класс для их хранения и добавить этот путь в свой путь автозагрузки.

Подробнее о композиторах представлений здесь

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top