Laravel, переменный вывод работает с View::share, но не с VIew::composer
Вопрос
Мне нужно одно и то же меню во всех моих представлениях.
Итак, я получаю данные, необходимые для вывода меню, в конструкторе, определенном в моем 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 и посмотрите, работает ли она.Это неплохое место для размещения ваших композиторов представлений, если у вас их не слишком много. Если у вас есть, вы можете создать новый класс для их хранения и добавить этот путь в свой путь автозагрузки.
Подробнее о композиторах представлений здесь