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

时间:2014-10-08 20:24:45

标签: php laravel laravel-4

我正在使用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,如果没有这个额外的步骤就无法看到视图编辑器变量。

2 个答案:

答案 0 :(得分:9)

这里的问题是事情发生的顺序。视图作曲家在匹配视图呈现之前被称为。这意味着在你的情况下:

  1. 查看home呈现
  2. 查看layouts.base的作曲家被称为
  3. 查看layouts.base呈现
  4. 这会导致变量global无法在home视图中使用。

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

    更改作曲家模式

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

    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);
    

    反思

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

答案 1 :(得分:0)

尝试此代码

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

$data = (object) $data;

View::share('global', $data);