6

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

在我的布局中,我有

@yield('content')

在我的页面中我有

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

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

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

@section('content')
    Hello!
@stop

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

我试过了

@section('content')
    Hello!
@overwrite

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

4

5 回答 5

10

在渲染任何子节点之前,刀片布局会沿着树向上到达路由或主视图。因此,扩展其他视图的嵌套视图必须始终先渲染其父视图。因此,包含部分的父视图将始终在子视图之前呈现。

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

由于不能始终坚持上述理想,或者仍然需要父部分内容,一个很好的替代方法是使用视图作曲家。View Composer 让您有机会在呈现任何特定视图时为它们声明变量。

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 文档。)

于 2013-10-15T14:42:34.513 回答
2

我不能保证对 Laravel 4 的支持,但对于那些正在寻找在 Laravel 5.5 中工作的解决方案(并且可能更早 - 很难检查)的人来说,是定义你在@extending 时需要的变量。

例如,在问题的示例中:

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

如果所需的数据可用于子视图,但使用不同的名称,则此方法可能特别有用。

例如,如果父视图需要一个$parent变量,但子视图只有一个$child变量,该变量具有引用父视图的属性,您可以这样做:

@extend('my.parent.view', ['parent' => $child->parent])
于 2017-10-25T15:49:42.980 回答
1

我不确定这是错误还是故意的,但 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如果实际视图中存在具有该名称的部分,这将防止变量被渲染。如果布局文件中的内容包含变量,这似乎是方法

于 2013-10-15T11:28:24.843 回答
0

在您的页面中尝试以下操作:

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

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

于 2021-10-30T23:23:28.770 回答
-5

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

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

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

希望这有帮助!

于 2015-04-16T20:53:31.147 回答