gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-10-31 22:45:37 24 4
gpt4 key购买 nike

我正在使用 Laravel View 编辑器与所有 View 共享几个变量。

app/composers.php:

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

我的理解是,任何使用 layouts.base 的东西都将获得 view composer 数据。

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 的 View 会抛出 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 如果没有这个额外的步骤它就看不到 View 编辑器变量。

最佳答案

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

  1. 查看 home 得到渲染
  2. layouts.base 的 View Composer 被调用
  3. 查看 layouts.base 得到渲染

这导致变量 globalhome View 中不可用。

这里有一些可能有帮助的解决方案

更改 Composer 模式

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

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

根本不要使用 Composer

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

将其放入app/filters.phpapp/start/global.php 或类似文件

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

$data = (object) $data;

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

反射(reflection)

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

关于php - 在扩展布局的 View 中无法访问 Laravel View Composer 变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26265772/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com