如何使控制器数据覆盖 Laravel 中的视图控制器?

Posted

技术标签:

【中文标题】如何使控制器数据覆盖 Laravel 中的视图控制器?【英文标题】:How to make the controller data override view controller in Laravel? 【发布时间】:2017-05-07 17:55:15 【问题描述】:

为了构建一个包含大量动态数据的侧边栏,我了解了 Laravel 中的 View composers。问题是 View Composers 在视图加载时触发,覆盖来自控制器的任何数据以获取具有相同名称的变量。不过,根据 Laravel 5.4 文档,我通过视图创建者实现了我想要的:

视图创建者与视图作曲家非常相似;然而,他们是 视图实例化后立即执行,而不是等待 直到视图即将渲染。要注册视图创建者,请使用 创建者方法:

据我了解,这意味着如果我在控制器和创建者中加载具有相同名称的变量,控制器应该覆盖它。但是,我的代码并没有发生这种情况。视图作曲家:

    public function boot()

    view()->creator('*', function ($view) 

            $userCompanies = auth()->user()->company()->get();
            $currentCompany = auth()->user()->getCurrentCompany();

        $view->with(compact('userCompanies', 'currentCompany'));
    );

这是其中一个控制器,例如:

    public function name()

    $currentCompany = (object) ['name' => 'creating', 'id' => '0', 'account_balance' => 'N/A'];

    return view('companies.name', compact('currentCompany'));

例如,所讨论的 $currentCompany 变量始终保留来自创建者的值,而不是被来自控制器的值覆盖。知道这里有什么问题吗?

【问题讨论】:

【参考方案1】:

经过一番研究,我意识到我最初的假设是视图创建者的数据可以被控制器的数据覆盖是错误的。创建者仍然以某种方式在控制器之后加载。但我找到了一个简单的解决方案。

对于那些想要使用 View composers/creator 来获取可能被覆盖的默认数据的人,请在 composer/creator 的 boot() 方法结束时在控制器和 composer/creator 数据之间进行数组合并,如下所示:

$with = array_merge(compact('userCompanies', 'currentCompany', 'currentUser'), $view->getData());
            $view->with($with);

【讨论】:

以上是关于如何使控制器数据覆盖 Laravel 中的视图控制器?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 laravel 中的控制器向部分视图发送数据?

如何将数据从控制器传递到 Laravel 中的视图

如何将视图中的数组传递给 ajax 并在 Laravel 5 的控制器中访问?

当我们压缩到视图时,如何对从控制器获取的 JSON 数组中的数据求和(Laravel)

如何通过重定向将数据传递到laravel中的视图

如何使用laravel中的控制器将多个变量传递给视图