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