在扩展布局的视图中无法访问Laravel View Composer变量
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在扩展布局的视图中无法访问Laravel View Composer变量相关的知识,希望对你有一定的参考价值。
我正在使用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
视图中不可用。
以下是一些可能有用的解决方案
Change the composer pattern
更改您的作曲家匹配模式以包括需要该变量的所有视图。如果可能,请使用通配符*
。
您甚至可以匹配每个视图:
View::composer('*', 'MyAppComposersBaseComposer');
Don't use composers at all
如果你需要(几乎)每个视图中的数据,你可以在应用程序启动时使用View::share
。
把它放在app/filters.php
,app/start/global.php
或类似文件中
$data = array(
'name' => 'John',
'status' => 'active'
);
$data = (object) $data;
View::share('global', $data);
Rethink
为什么不同的视图需要相同的全局数据?您是否可以将需要数据的视图部分移动到部分视图中,然后可以包含该部分视图?
试试这段代码
$data = array(
'name' => 'John',
'status' => 'active'
);
$data = (object) $data;
View::share('global', $data);
以上是关于在扩展布局的视图中无法访问Laravel View Composer变量的主要内容,如果未能解决你的问题,请参考以下文章
请教laravel view 怎么显示 controller 中传递的对象值