从Laravel docs,您可以使用两种方法在布局中包含“部分”:
<html>
<body>
@section('sidebar')
This is the master sidebar.
@show
<div class="container">
@yield('content')
</div>
</body>
</html>
由于@yield
也可以使用@yield('section', 'Default Content')
传递一些默认内容,@yield
只是@section
使用@parent
的简写吗?< / p>
@section
<!-- Nothing here -->
@show
还有其他什么差异?
答案 0 :(得分:22)
这一行清除了混淆:&#34;请注意,扩展Blade布局的视图只是覆盖布局中的部分。布局内容可以使用@parent
指令在子视图中包含在&#34;部分中。
因此,如果您已在主布局中定义@section
,则除非您在子布局@parent
内指定@section
,否则将覆盖它。
但是对于@yield
,它总是从子布局中获取部分。这意味着它始终会覆盖@yield
部分,即使其默认定义为@yield('section', 'Default Content')
。
我希望能够清除你的困惑。如果您有更多问题,请与我们联系。感谢
答案 1 :(得分:17)
简短回答:始终使用@yield
,除非您想要做一些更复杂的事情,然后提供默认的string
。
长答案: 每当您扩展刀片模板时,都会选择覆盖 @yield 和 @section .. @show 。使用 @yield 可以完成的所有操作也可以使用 @section .. @show 完成,但不是相反。以下是他们的所作所为:
<强> @yield( '主')强>
@section('main').. @ show
以下是一些示例:test.blade.php
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Test</title>
</head>
<body>
<h1>This is a test</h1>
@yield('mainA')
@yield('mainB', 'This is the alternative 1')
@yield('mainC', '<p>This is the alternative 2</p>')
@yield('mainD', 'This is the alternative 3')
@section('testA')
@show
@section('testB')
This is the alternative 4
@show
@section('testC')
<p>This is the alternative 5</p>
@show
@section('testD')
<p>This is the alternative 6</p>
@show
</body>
</html>
这是另一个名为testA.blade.php
的文件,它扩展了另一个刀片文件:
@extends('test')
@section('mainD')
<div>
<p>First replacement!</p>
<hr>
</div>
@endsection
@section('testC')
<div>
<p>Second replacement!</p>
<hr>
</div>
@endsection
@section('testD')
@parent
<div>
<p>Additional content</p>
<hr>
</div>
@endsection
这就是结果:
答案 2 :(得分:3)
基本上yield('content')
是一个标记。例如,如果您放置yield('content')
,则在标记中,您说这部分具有内容的名称,顺便说一句,您可以在括号内命名您想要的任何内容。它不必满足。它可以是收益(&#39;内部&#39;)。或任何你想要的东西。
然后在您要从布局页面导入html的子页面中,您只需说出('name of the section')
部分。
例如,如果您已在布局页面中将标题标记为yield ('my_head_band')
&lt; - 或您想要的任何其他内容,那么请在您的子页面中说出@section('my_head_band')
。
这会将布局页面中的标题导入您的子页面。反之亦然,你的身体部分,在这种情况下被命名为内容。
希望这有帮助。
答案 3 :(得分:0)
最短答案:
如果要完全覆盖主版式上的子数据,请在主版中使用@yield
。
如果要与@section
一起在子级上使用主数据和子级数据,请在母版中使用@parent
(或在@yield
等主版式上覆盖子数据)
答案 4 :(得分:0)
只需添加一些小内容,@yield
基本上定义了一个由overwriting
数据注入的部分,并且如果我们的视图@extends
是父视图,它也可以工作。
现在,当我们overwrite
时,我们用新的实现完全替换了一个实现,就像公司可以在发现某个问题出了问题时决定更改/覆盖其整个技术一样。
不应与override