Laravel,变量输出与View::share一起工作,但与View::composer不一起工作

Laravel,变量输出与View::share一起工作,但与View::composer不一起工作,view,laravel,laravel-4,twig,View,Laravel,Laravel 4,Twig,我需要在所有视图中使用相同的菜单 因此,我在BaseController中定义的构造函数中获取输出菜单所需的数据 为了获取数据,我首先尝试使用View::composer,但不知道为什么我没有得到任何错误,看起来View::composer根本没有执行 如果我使用View::share,它的工作 //BaseController.php //function called in the constructor public function init() { $envs = $this-

我需要在所有视图中使用相同的菜单

因此,我在BaseController中定义的构造函数中获取输出菜单所需的数据

为了获取数据,我首先尝试使用View::composer,但不知道为什么我没有得到任何错误,看起来View::composer根本没有执行

如果我使用View::share,它的工作

//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);
    });
}
//小枝

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

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

我是新加入laravel的,所以我可能错过了什么?

我认为这不起作用的原因是因为您在代码中放置了视图生成器。Laravel中的视图生成器本质上是在呈现视图时立即执行的回调。这是在哪里定义的
init()
函数?我的猜测是,视图是在定义视图生成器之前创建的,这意味着永远不会执行视图生成器回调

尝试从
init()
函数中移动整个view composer块,并将其附加到routes.php文件的底部,看看它是否有效。如果没有太多的视图生成器,那么放置视图生成器并不是一个不好的地方,如果有,您可以创建一个新类来存储它们,并将该路径添加到自动加载路径中


阅读更多有关view composer的信息

我已经基于您的链接编写了我的view composer,它说明了我们必须将它们放在一个特殊位置的事实。:/这意味着视图在BaseController构造函数之前呈现?有点奇怪!谢谢你的回答,我将使用类来存储它们。我只想知道一件事,在我的示例中,我应该使用视图生成器还是继续使用视图共享?我已经看到了关于这方面的主题,但没有真正回答,因为视图共享对于所有视图来说都是全局的,所以我的基本模板上的视图生成器也应该这样做,因为我的所有模板都扩展了base.twig模板?我不认为视图是在BaseController之前呈现的-它们是在,视图生成器回调仅在创建新视图时触发……因此,原始代码中的视图生成器调用永远不会触发,因为它们的视图已经创建。至于视图共享VS composer,如果您需要在回调中做一些事情来更改传递给视图的变量,我会使用composer。如果您只是向视图传递一个非动态变量,我的建议是使用视图共享。