Laravel, saída variável funciona com View::share mas não com VIew::composer
Pergunta
Preciso do mesmo menu em todas as minhas visualizações.
Assim, obtenho os dados necessários para gerar o menu em um construtor definido em meu BaseController.
Para obter os dados, primeiro tentei usar o View::composer, mas não sei por que não recebo nenhum erro, parece que o View::composer não foi executado ...
Se eu usar View::share, funciona
//BaseController.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 %}
Sou novo no laravel, então talvez esteja faltando alguma coisa?
Solução
Acho que o motivo pelo qual isso não está funcionando é onde você colocou o View Composer em seu código.View Composers no Laravel são essencialmente retornos de chamada que são executados assim que a visualização é renderizada.Onde é isso init()
função definida?Meu palpite é que a visualização está sendo criada antes seu view compositor está definido - o que significa que o retorno de chamada do view compositor nunca será executado.
Tente mover todo o bloco do compositor de visualização do init()
função e anexe-a ao final do seu arquivo Routes.php e veja se funciona.Esse não é um lugar ruim para colocar seus compositores de visualização se você não tiver muitos; se tiver, você pode criar uma nova classe para armazená-los e adicionar esse caminho ao seu caminho de carregamento automático.
Leia mais sobre compositores de visualização aqui