我正在使用Laravel 4和刀片模板,并在尝试扩展模板时遇到问题。
在我的布局中我有
@yield('content')
在我的页面中我有
@section('content')
Welcome {{ $name }}
@stop
工作正常,我创建了另一个与我的第一个非常相似的页面,只想更改覆盖管理内容部分。模板中的其他部分都很好。
所以我扩展了我的页面,并且
@section('content')
Hello!
@stop
我使用$ name变量得到一个未定义的通知。
我试过
@section('content')
Hello!
@overwrite
同样的交易,我收到通知错误。 我检查了我的控制器,它使用的是正确的模板。我没有打电话给@parent,所以我不明白,如何在没有通知错误的情况下覆盖模板中的某个部分?
答案 0 :(得分:9)
在渲染任何子项之前,刀片布局在树中向上行进到路径或主视图。因此,扩展其他视图的嵌套视图必须始终在父视图之前呈现它们。因此,包含节的父视图将始终在子节点之前呈现。
为了克服您遇到的问题,最好只嵌套不覆盖包含变量的父节的页面,因为父节点内容将始终在子节点之前呈现。
由于不能始终遵守上述理想或仍需要父母部分内容,因此使用视图作曲家的另一种方法是。视图作曲家为您提供了在呈现任何特定视图时声明变量的机会。
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);
});
答案 1 :(得分:1)
我不确定这是一个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
被渲染。如果布局文件中的内容包含变量
答案 2 :(得分:1)
我无法保证对Laravel 4的支持,但对于那些寻找在Laravel 5.5中工作的解决方案(可能还有一点 - 很难检查)的人来说,是@extend
定义所需的变量ING。
E.g。在问题的例子中:
@extend('my.parent.view', ['name' => ''])
如果所需的数据 可用于子视图,但使用不同的名称,则此方法尤其有用。
E.g。如果父视图需要$parent
变量,但子视图只有一个$child
变量,该变量具有引用父项的属性,您可以这样做:
@extend('my.parent.view', ['parent' => $child->parent])
答案 3 :(得分:-4)
我找到了解决此问题的简单方法:)
只需在父视图中调用的变量/方法之前添加 @ 符号即可。如果出现错误(通知/警告),PHP将忽略该错误并继续执行。
这并不完美,但请将我们保存到代码视图/作曲家。
希望这有帮助!