web-dev-qa-db-ja.com

Laravel-@yieldと@sectionの違い?

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
_

他にどんな違いがありますか?

21
dayuloli

この行は、「Bladeレイアウトを拡張するビューがレイアウトのセクションをオーバーライドするだけであることに注意してください。セクションの_@parent_ディレクティブを使用して、レイアウトのコンテンツを子ビューに含めることができます。」.

したがって、マスターレイアウトで_@section_が既に定義されている場合、子レイアウトの_@parent_内で_@section_を指定しない限り、オーバーライドされます。

ただし、_@yield_の場合、常に子レイアウトからセクションを取得します。つまり、デフォルトが@yield('section', 'Default Content')として定義されている場合でも、常に_@yield_部分をオーバーライドします。

これで混乱が解消されることを願っています。さらに質問がある場合はお知らせください。ありがとう

25
Sameer Nyaupane

ショートアンサー@yieldを使用するのは、デフォルトのstringを提供するより複雑な操作を行う場合を除きます。


ロングアンサー@ yield@ section .. @showは、ブレードテンプレートを拡張するたびにオプションで上書きされるために使用されます。 @ yieldでできることはすべて、@ section .. @showしかし、その逆ではありません。彼らがすることは次のとおりです。

@ yield( 'main')

  • に置き換えることができます@ section( 'main').. @endsection
  • デフォルトの文字列を提供できますが、HTMLは提供できません!デフォルトの文字列は、@ section( 'main').. @endsectionが指定されていない場合、サブブレードテンプレートに表示されます。

@ section( 'main').. @show

  • に置き換えることができます@ section( 'main').. @endsection
  • デフォルトのHTMLコードを提供できます。デフォルトのHTMLコードは、@ section( 'main')が指定されていない場合、サブブレードテンプレートに表示されます。
  • @ section( 'main')@ parent .. @endsectionに置き換えることができ、さらにデフォルトのHTMLコードを表示します。

ここにいくつかの例: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

それが結果です:

enter image description here

23
Adam

基本的に、yield('content')はマーカーです。たとえば、タグにyield('content')を入れた場合、このセクションにはコンテンツの名前が付けられ、ちなみに、括弧内に任意の名前を付けることができます。コンテンツである必要はありません。 yield( 'inside')にすることができます。またはあなたが欲しいもの。

そして、レイアウトページからhtmlをインポートする子ページで、section _('name of the section')_と言うだけです。
たとえば、レイアウトページのヘッダーにyield _('my_head_band')_ <-またはその他の任意のマークを付けた場合、子ページでは@section('my_head_band')とだけ言うことになります。

これにより、レイアウトページから子ページにヘッダーがインポートされます。この場合、コンテンツとして名前が付けられたあなたのボディセクションと逆も同様です。

お役に立てれば。

3
Pradeep Sahoo

何か小さなものを追加するために、@yieldは、基本的にoverwritingデータによって挿入されるセクションを定義し、ビュー@extends親ビュー。

overwriteのとき、実装が完全に新しい実装に置き換えられます。たとえば、企業が何か問題が発生したことに気付いた場合、テクノロジー全体を変更/上書きすることを決定できます。

overrideと混同しないでください。

0
Tony Okoth

最短回答:

マスターレイアウト上の子データを完全に上書きする場合は、マスターで@yieldを使用します。

@sectionを使用して子でマスターデータと子データを一緒に使用する場合は、マスターで@parentを使用します(または、@yieldなどのマスターレイアウトで子データを上書きします)

0