Laravel View Composer变量在扩展布局的视图中不可访问


Laravel View Composer variables not accessible in views that extend layout

我使用Laravel视图编辑器与所有视图共享几个变量。

app/composers.php:

View::composer('layouts.base', 'MyApp'Composers'BaseComposer');

我在这里的理解是,任何使用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'], 'MyApp'Composers'BaseComposer');

我想了解为什么如果home扩展layouts.base,那么如果没有这个额外的步骤,它就看不到视图编辑器变量。

这里的问题是事情发生的顺序。在渲染匹配的视图之前,会调用视图编辑器。这意味着在你的情况下:

  1. 视图home得到渲染
  2. 调用layouts.base的视图编辑器
  3. 视图layouts.base得到渲染

这导致变量globalhome视图中不可用。

以下是一些可能有助于的解决方案

更改作曲家模式

更改composer匹配模式以包括所有需要该变量的视图。如果可能,请使用通配符*
您甚至可以匹配每个视图:

View::composer('*', 'MyApp'Composers'BaseComposer');

根本不用作曲家

如果您需要(几乎)每个视图中的数据,那么您可以在应用程序启动期间使用View::share

将其放入app/filters.phpapp/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);