我使用Laravel视图编辑器与所有视图共享几个变量。
app/composers.php
:
View::composer('layouts.base', 'MyAppComposersBaseComposer');
我在这里的理解是,任何使用layouts.base
的东西都将获得视图编辑器数据。
BaseComposer@compose
,简化:
public function compose($view) {
// Some logic left out here that pulls in some data
$data = array(
'name' => 'John',
'status' => 'active'
);
$data = (object) $data;
return $view->with('global', $data);
}
给定此layouts.base
:
{{ $global->name }}
@include('layouts.partials.header')
@yield('content')
$global->name
被找到,并且这在包括的layouts.partials.header
:中也是如此
{{ $global->status }}
但是,扩展layouts.base
的视图会抛出Undefined variable: global
错误:
home.blade.php
@extends('layouts.base')
@section('content')
{{ $global->name }}
@stop
如果我将composers.php
修改为引用home
:,一切都很好
View::composer(['layouts.base', 'home'], 'MyAppComposersBaseComposer');
我想了解为什么如果home
扩展layouts.base
,那么如果没有这个额外的步骤,它就看不到视图编辑器变量。
这里的问题是事情发生的顺序。在渲染匹配的视图之前,会调用视图编辑器。这意味着在你的情况下:
- 视图
home
得到渲染 - 调用
layouts.base
的视图编辑器 - 视图
layouts.base
得到渲染
这导致变量global
在home
视图中不可用。
以下是一些可能有助于的解决方案
更改作曲家模式
更改composer匹配模式以包括所有需要该变量的视图。如果可能,请使用通配符*
您甚至可以匹配每个视图:
View::composer('*', 'MyAppComposersBaseComposer');
根本不用作曲家
如果您需要(几乎)每个视图中的数据,那么您可以在应用程序启动期间使用View::share
。
将其放入app/filters.php
、app/start/global.php
或类似文件中
$data = array(
'name' => 'John',
'status' => 'active'
);
$data = (object) $data;
View::share('global', $data);
重新思考
为什么不同的视图需要相同的全局数据?您是否可以将视图中需要数据的部分移动到部分视图中,然后将其包括在内?
尝试此代码
$data = array(
'name' => 'John',
'status' => 'active'
);
$data = (object) $data;
View::share('global', $data);