我的主要布局模板/views/web/main_lo.blade.php
为
<html>
<head>
<meta charset="UTF-8">
<title>{{$title or 'Default Title'}}</title>
</head>
<body>
<div class="section-1-outer">
@section('section-1')
<div class="section-1-parent">parent section 1</div>
@show
</div>
<div class="section-2-outer">
@section('section-2')
<div class="section-2-parent">parent section 2</div>
@show
</div>
<div class="section-3-outer">
@section('section-3')
<div class="section-3-parent">parent section 3</div>
@show
</div>
<div>
@yield('content')
</div>
</body>
</html>
和部分模板:
@extends('web.main_lo')
@section('section-1')
@parent
<div class='section-1-child'>
<p>Appended to parent</p>
</div>
@stop
@section('section-2')
<div class='section-2-child'>
<p>Replace parent</p>
</div>
@stop
@section('section-3')
<div class='section-3-child'>
<p>Replace parent</p>
</div>
@overwrite
现在这里的部分布局正在扩展main_lo,这里是第一部分-1,很明显,子部分将包括父部分-1,父部分中的内容也将被打印。
现在我的困惑是第2节和第3节实现之间的区别,因为它们都替换了父节的内容,只有子节目中的内容被打印。我的意思是当documentation明确指出
时,需要额外的@overwrite
标记
“请注意,扩展Blade布局的视图只会覆盖部分 从布局。“
然后使用@overwrite
覆盖部分,这也用于替换父部分的内容。
答案 0 :(得分:4)
Laravel视图的部分有点奇怪,不好的部分是它从一开始就不明显。
部分实际上是以相反的顺序扩展,首先定义的部分将是子级,后者将是父级。所以@parent
实际上包含了可能出现的部分的内容
这就是为什么我认为父母和孩子不是这个系统的最佳术语。
这是不明显的,因为传统的用例 - 布局 - 看起来布局部分是首先定义的部分。但实际上它们是在呈现内容部分之后运行的。
这意味着@overwrite
实际上与父部分一起使用,而不是子部分。在你的例子中,因为你在布局中放弃了(@show
),这意味着你不想在那里覆盖。
之所以这样做,实际上是因为@overwrite
是针对不太常规的用例而制作的,而不是当你有布局内容,父子关系时。
大多数情况下,当您包含一些部分文件(可能是整个地方)时会发生这种情况 - 您使用相同的部分名称,并且当先前定义的部分显示而不是后者时,您会遇到问题。