Laravel フレームワークの Blade テンプレート エンジンは非常に使いやすいですが、公式ドキュメントの Blade の概要については詳しく書かれていないことや、明確になっていないこともあります。たとえば、使用中に次の問題が発生する可能性があります:
1. @yield と @section は両方とも置換可能なブロックを事前定義できます。この 2 つの違いは何ですか?
2. @section は @show、@stop、@overwrite、@append で終了できます。これら 3 つの違いは何ですか?
この記事では、これらの問題について比較的シンプルだが直観的に紹介しようとしています。
@yield と @section
まず第一に、@yield は拡張可能ではありません。定義したいセクションに、拡張するサブテンプレートのデフォルトのコンテンツがない場合は、@yield( を使用する方が便利です。 $name、$default)。サブテンプレートでこのブロックの内容を指定しない場合は、デフォルトの内容が表示されます。定義されている場合は、定義した内容が表示されます。それはどちらか/またはです。
対照的に、@section は置き換えることも拡張することもできます。これが最大の違いです。例:
{{-- layout.master --}} @yield('title','默认标题') @section('content') 默认的内容 @show
{{-- home.index --}} @extends('layout.master') @section('title') @parent 新的标题 @stop @section('content') @parent 扩展的内容 @stop
上記の例では、テンプレートは @yield と @section を使用してそれぞれブロックを定義し、@yield は @parent を追加しても展開できないため、サブテンプレートにコンテンツを定義します。機能しません。出力内容は「デフォルトのタイトル」を置き換える「新しいタイトル」のみです。したがって、最終的に生成されるページは「デフォルト タイトル」または「新しいタイトル」のみにすることができ、両方にすることはできません。 @sectionで定義した部分は、@parentキーワードを使用しているため、親テンプレートの内容を保持し、展開後に追加した内容が追加され、出力内容は「デフォルトの内容を展開したもの」となります。コンテンツ"。
公式 Web サイトのドキュメントには @parent キーワードが含まれていません。これをオーバーライドするには、@override を使用して終了する必要があります。[github の最新ドキュメント] ][ドキュメント] 修正が行われました。 @section と @stop の場合、デフォルトは置換 (挿入) であり、展開するには @parent キーワードを使用する必要があります。 @override キーワードには、実際には別のアプリケーション シナリオがあります。
@show と @stop
次に、@section に対応する終了キーワードについて説明します。@show と @stop の違いは何でしょうか。 (インターネット上の一部の記事と一部のエディタ プラグインでも @endsection を要求します。これはバージョン 4.0 で削除されました。下位互換性がありますが、その使用は推奨されません)。
@show は、実行がこの時点に到達したときにセクション内のコンテンツをページに出力することを指しますが、 @stop はコンテンツの解析のみを実行し、@override でカバーされない限り、現在のテンプレート内のセクションの後続の処理を処理しません (「詳細については次のセクションを参照してください)。一般に、初めてセクションを定義する場合は @show を使用し、置換または拡張する場合は @show を使用せず、@stop を使用する必要があります。以下は例です。
{{-- layout.master --}} <div id="zoneA"> @section('zoneA') AAA @show </div> <div id="zoneB"> @section('zoneB') BBB @stop </div> <div id="zoneC"> @section('zoneC') CCC @show </div>
{{-- page.view --}} @extends('layout.master') @section('zoneA') aaa @stop @section('zoneB') bbb @stop @section('zoneC') ccc @show
layout.masterでは、@stopを使用して「zoneB」を終了します。テンプレートシステム全体に@showで終わる「zoneB」の定義がないため、このブロックは表示されません。 page.view では、「zoneC」が @show で定義されており、実行がここに到達するとすぐにコンテンツを表示し、テンプレート継承メカニズムに従ってコンテンツを上書きし続けるため、最終的に表示されるコンテンツは次のようになります:
ccc // 来自 page.view <div class="zoneA"> aaa </div> <div class="zoneB"> </div> <div class="zoneC"> ccc </div>
結果からわかるように、zoneB のコンテンツは失われます。これは、@show を使用してエンジンにコンテンツのこの部分を出力するよう指示していないためです。一方、zoneC のコンテンツは 2 回表示され、レイアウトのページ構造は失われます。 @show が 2 回出現するため、.master も破棄されます。
@append と @override
先ほど述べたように、@override は親テンプレートのデフォルトのコンテンツを置き換えるために子テンプレートのコンテンツを指定するのではなく、別の目的があります。これには、セクションがテンプレート内で複数回使用される可能性があるという問題が含まれます。つまり、定義した各セクションは、実際には後続のサブテンプレートに複数回出現する可能性があります。例:
{{-- master --}} <div> @yield('content') </div>
{{-- subview --}}
@extends('master')
@section('content')
コンテンツの行を追加
@append
@section('content')
コンテンツを 1 行追加します
@append
@section('content')
で十分です。これで終わりにしましょう。
@stop
上記の例では、親テンプレートに「content」という名前のセクションのみを定義し、子テンプレートでこのセクションのコンテンツを 3 回指定しました。 この例の最終出力は次のとおりです:
<div> 加一行内容 再加一行内容 加够了,到此为止吧。 </div>
3 回指定されたコンテンツが表示されます。キーは @append キーワードにあり、「ここにコンテンツが追加される」ことを示すため、コンテンツは展開され続けます。最後に @stop が付けられており、このセクションの処理がここで終了することを示します。 @append または @stop を使用してこのセクションの内容を指定し続けると、その内容は有効になりません。 @override で処理されない限り。 @override は、「以前の定義をすべて上書きし、この定義が優先される」ことを意味します。例:
{{-- master --}} <div> @yield('content') @yield('message') </div>
{{-- master --}} <div> @section('content') 加一行内容 @append @section('content') 再加一行内容 @append @section('content') 加够了,结束吧 @stop @section('content') 都不要了,我说的。 @override </div>
この例は、一連の定義が最後に追加される点を除いて、先ほどの例と似ています。最終的な出力は次のようになります:
<div> 都不要了,我说的。 </div>
したがって、正式なプロジェクトでは、データを走査して出力する必要がある場合があります。しかし、特定のデータを走査して、前のデータがすべて間違っていることが判明した場合はどうなるでしょうか。 ? @override を使用してそれらをすべてオーバーライドします。
Laravel テンプレート エンジン Blade の一部のセクション タグの違いの詳細については、PHP 中国語 Web サイトを参照してください。