Laravel,变量输出适用于 View::share 但不适用于 VIew::composer

Posted

技术标签:

【中文标题】Laravel,变量输出适用于 View::share 但不适用于 VIew::composer【英文标题】:Laravel, variable output work with View::share but not with VIew::composer 【发布时间】:2014-01-08 22:24:47 【问题描述】:

我的所有视图都需要相同的菜单。

所以我在 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);
    );

//base.twig

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

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

我是 laravel 的新手,所以也许我错过了什么?

【问题讨论】:

【参考方案1】:

我认为这不起作用的原因是您将 View Composer 放在代码中的位置。 Laravel 中的 View Composers 本质上是在视图渲染后立即执行的回调。这个init() 函数在哪里定义?我的猜测是视图是在定义视图编写器之前创建的——这意味着视图编写器回调将永远不会被执行。

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

阅读更多关于视图作曲家here

【讨论】:

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

以上是关于Laravel,变量输出适用于 View::share 但不适用于 VIew::composer的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 新命令不再适用于 MAC

Laravel 5.2 路由仅适用于根目录

Laravel 图像规则验证不适用于 Laravel 8,但适用于 Laravel 7 |拉拉维尔 |图片 |验证

为啥 Laravel 中间件适用于单个路由而不适用于一组路由

JSON Web Token 仅适用于具有 Eloquent 模型的 Laravel

未找到 laravel 类(适用于 localhost 但不适用于 DO 服务器)