要构建一个包含大量动态数据的侧边栏,我了解了Laravel中的View作曲家。问题是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变量始终保留创建者的值,而不是被控制器中的值覆盖。知道这里有什么问题吗?
答案 0 :(得分:0)
经过一番研究,我意识到我最初的假设是来自视图创建者的数据可能被来自控制器的数据覆盖是错误的。创建者仍然以某种方式在控制器之后加载。但我找到了一个简单的解决方案。
对于那些想要将View composers / creators用于可以被覆盖的默认数据的人,请在作曲家/创作者的boot()方法结束时在控制器和编辑器/创建者数据之间进行数组合并,如此:
$with = array_merge(compact('userCompanies', 'currentCompany', 'currentUser'), $view->getData());
$view->with($with);