繁体   English   中英

覆盖 Laravel 刀片模板中的部分,抛出未定义的变量错误

[英]Override section in a laravel blade template throwing undefined variable errors

我正在使用 Laravel 4 和刀片模板,并在尝试扩展模板时遇到问题。

在我的布局中,我有

@yield('content')

在我的页面中,我有

@section('content')
    Welcome {{ $name }}
@stop

效果很好,我创建了另一个与我的第一个页面非常相似的页面,并且只想更改覆盖管理内容部分。 模板中的其他部分很好。

所以我扩展我的页面,然后做

@section('content')
    Hello!
@stop

我收到一个带有 $name 变量的未定义通知。

我试过

@section('content')
    Hello!
@overwrite

同样的交易,我收到通知错误。 我检查了我的控制器,它使用了正确的模板。 我没有打电话给@parent 所以我不明白,我怎样才能在没有通知错误的情况下覆盖模板中的一个部分?

在渲染任何子项之前,刀片布局在树中向上行进到路径或主视图。 因此,扩展其他视图的嵌套视图必须始终在父视图之前呈现它们。 因此,包含节的父视图将始终在子节点之前呈现。

为了克服您遇到的问题,最好只嵌套不覆盖包含变量的父节的页面,因为父节点内容将始终在子节点之前呈现。

由于不能始终遵守上述理想,或者仍然需要父母部分内容,因此一种好的替代方法是使用视图作曲家。 视图作曲家为您提供了在呈现任何特定视图时声明变量的机会。

View::composer(array('pages.admin'), function($view)
{
    $view->with('name', Auth::user()->username);
});

另一种选择是使用视图创建者。 在实例化视图而不是呈现视图时,创建者会被触发。 此方法允许您在呈现视图之前覆盖变量。

View::creator(array('pages.admin'), function($view)
{
    $view->with('name', Auth::user()->username);
});

您可以在此处的文档中阅读有关这些方法的更多信息。 (或者这里是Laravel 5文档。)

我不确定这是一个bug还是故意的,但是在解释刀片指令之前,似乎Laravel会渲染变量。 解决方法是:

景色/布局/ testlayout.blade.php:

    <html>
    <body>
        @yield('sidebar', 'This is the master sidebar. {{ $name }}' )

        <div class="container">
            @yield('content')
        </div>
    </body>
   </html>

实际视图:views / test.blade.php

@extends('layouts.testlayout')


@section('sidebar')
   No variable in the child
@stop

@section('content')
    This is a child content
@stop

如果在实际视图中有一个具有该名称的部分,这可以防止变量$name被渲染。 如果布局文件中的内容包含变量,这似乎就是这种方法

我无法保证对Laravel 4的支持,但对于那些寻找在Laravel 5.5中工作的解决方案(可能还有一点 - 很难检查)的人来说,定义@extend时需要的变量。

例如,问题中的示例:

@extend('my.parent.view', ['name' => ''])

如果需要的数据提供给儿童的观点,但以不同的名称这种做法会特别有用。

例如,如果父视图需要$parent变量,但子视图只有一个$child变量,该变量具有引用父变量的属性,则可以执行以下操作:

@extend('my.parent.view', ['parent' => $child->parent])

在您的页面中试试这个:

@section('content')
    @hasSection('content')
        @yield('content')
    @else
        Welcome {{ $name }}
    @endif
@stop

并阅读这篇文章以获得更多灵感https://laracasts.com/discuss/channels/laravel/laravel-blade-layouts-inheritence-problem

我找到了解决这个问题的简单方法:)

只需在父视图中调用的变量/方法之前添加@符号即可。 如果出现错误(通知/警告),PHP将忽略该错误并继续执行。

它并不完美,但请将我们保存到代码视图/作曲家。

希望这有帮助!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM