Laravel docs から、2つの方法を使用してレイアウト内に「セクション」を含めることができます。
_<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
_の短縮形にすぎませんか?
_@section
<!-- Nothing here -->
@show
_
他にどんな違いがありますか?
この行は、「Bladeレイアウトを拡張するビューがレイアウトのセクションをオーバーライドするだけであることに注意してください。セクションの_@parent
_ディレクティブを使用して、レイアウトのコンテンツを子ビューに含めることができます。」.
したがって、マスターレイアウトで_@section
_が既に定義されている場合、子レイアウトの_@parent
_内で_@section
_を指定しない限り、オーバーライドされます。
ただし、_@yield
_の場合、常に子レイアウトからセクションを取得します。つまり、デフォルトが@yield('section', 'Default Content')
として定義されている場合でも、常に_@yield
_部分をオーバーライドします。
これで混乱が解消されることを願っています。さらに質問がある場合はお知らせください。ありがとう
ショートアンサー:@yield
を使用するのは、デフォルトのstring
を提供するより複雑な操作を行う場合を除きます。
ロングアンサー:@ yieldと@ section .. @showは、ブレードテンプレートを拡張するたびにオプションで上書きされるために使用されます。 @ yieldでできることはすべて、@ section .. @showしかし、その逆ではありません。彼らがすることは次のとおりです。
@ yield( 'main')
@ 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
それが結果です:
基本的に、yield('content')
はマーカーです。たとえば、タグにyield('content')
を入れた場合、このセクションにはコンテンツの名前が付けられ、ちなみに、括弧内に任意の名前を付けることができます。コンテンツである必要はありません。 yield( 'inside')にすることができます。またはあなたが欲しいもの。
そして、レイアウトページからhtmlをインポートする子ページで、section _('name of the section')
_と言うだけです。
たとえば、レイアウトページのヘッダーにyield _('my_head_band')
_ <-またはその他の任意のマークを付けた場合、子ページでは@section('my_head_band')
とだけ言うことになります。
これにより、レイアウトページから子ページにヘッダーがインポートされます。この場合、コンテンツとして名前が付けられたあなたのボディセクションと逆も同様です。
お役に立てれば。
何か小さなものを追加するために、@yield
は、基本的にoverwriting
データによって挿入されるセクションを定義し、ビュー@extends
親ビュー。
overwrite
のとき、実装が完全に新しい実装に置き換えられます。たとえば、企業が何か問題が発生したことに気付いた場合、テクノロジー全体を変更/上書きすることを決定できます。
override
と混同しないでください。
最短回答:
マスターレイアウト上の子データを完全に上書きする場合は、マスターで@yield
を使用します。
@section
を使用して子でマスターデータと子データを一緒に使用する場合は、マスターで@parent
を使用します(または、@yield
などのマスターレイアウトで子データを上書きします)