在扩展布局的视图中无法访问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它没有这个额外的步骤就看不到视图作曲家变量。

答案

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

  1. 查看home获得渲染
  2. 查看layouts.base的作曲家被召唤
  3. 查看layouts.base获得渲染

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

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

Change the composer pattern

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

View::composer('*', 'MyAppComposersBaseComposer');

Don't use composers at all

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

把它放在app/filters.phpapp/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 中传递的对象值

无法从控制器 laravel 访问视图中的变量

Laravel View Composer 为每个视图复制 SQL 查询

如何与 js 文件 laravel 共享变量?

我可以使用 Kotlin 合成扩展让两个 xml 布局使用相同的视图吗?