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

Jkl*_*leg 12 php laravel laravel-4

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

app/composers.php:

View::composer('layouts.base', 'MyApp\Composers\BaseComposer');
Run Code Online (Sandbox Code Playgroud)

我的理解是,任何使用的东西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);
    }
Run Code Online (Sandbox Code Playgroud)

鉴于此layouts.base:

  {{ $global->name }}

  @include('layouts.partials.header')

  @yield('content')
Run Code Online (Sandbox Code Playgroud)

$global->name被发现,所以包括在内layouts.partials.header:

  {{ $global->status }}
Run Code Online (Sandbox Code Playgroud)

但是,扩展的视图会layouts.base引发Undefined variable: global错误:

home.blade.php

@extends('layouts.base')
@section('content')
  {{ $global->name }}
@stop
Run Code Online (Sandbox Code Playgroud)

如果我修改composers.php引用,一切正常home:

View::composer(['layouts.base', 'home'], 'MyApp\Composers\BaseComposer');
Run Code Online (Sandbox Code Playgroud)

我想理解为什么如果home扩展layouts.base它没有这个额外的步骤就看不到视图作曲家变量.

luk*_*ter 13

这里的问题是事情发生的顺序.视图编辑器在匹配视图呈现之前被调用.这意味着在你的情况下:

  1. 视图home得到渲染
  2. 查看作曲家layouts.base获取的名称
  3. 视图layouts.base得到渲染

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

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

更改作曲家模式

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

View::composer('*', 'MyApp\Composers\BaseComposer');
Run Code Online (Sandbox Code Playgroud)

根本不要使用作曲家

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

把这个app/filters.php,app/start/global.php或类似的文件

$data = array(
    'name' => 'John',
    'status' => 'active'
);

$data = (object) $data;

View::share('global', $data);
Run Code Online (Sandbox Code Playgroud)

反思

为什么不同的视图需要相同的全局数据?您是否可以将需要数据的视图部分移动到部分视图中,然后可以包含该部分视图?

  • 这是令人失望的.@ extends is@ extends is@ extends is@ extends.它意味着扩展视图IS_A扩展视图,因此应该具有扩展视图HAS的所有内容.该框架应该尽力确保这一点,甚至在必要时引入一个单独的"收集视图作曲家来自@ extends hierarchy". (2认同)