Laravelで指定したデータやコードを@yieldに渡すことができるディレクティブに@sectionがあります。
@sectionにはディレクティブの終了を示すものに、@endsection, @stop, @showが用意されています。
ここでは、@endsection, @stop, @showのそれぞれの意味や使い方を実例で解説しています。
@endsection
@endsectionとは何か?
@endsectionとは@sectionを閉じるときに使われるディレクティブの1つです。
@sectionと@endsectionの間にコードを記述することで、対象となる@yieldに指定したコードを丸ごと渡すことができます。
@section('セクション名') コード @endsection
実例
例えば、「views > template > heading.blade.php」というパスの「heading.blade.php」ファイルに@yield('header')
と記載してあるとします。
<body>
@yield('header')
</body>
これは、@extendsで呼び出されたときに、そのファイルに@sectionでセクション名「header」の内容を表示するという記述です。
この「heading.blade.php」を「views > index.blade.php」で@extendsで呼び出します。
@extends('template.heading')
このままでは、呼び出した内容は<body>@yield('header')</body>
のままです。
この@yieldに内容を渡すための@sectionを追記します。
@extends('template.heading')
@section('header')
<h1>ページの見出しです</h1>
<p>リード文です</p>
@endsection
こうすることで、@yieldのセクション名「header」に対象となる@sectionと@endsectionで囲まれた部分のコードが入ります。
「index.blade.php」のコンパイル結果は以下のようになります。
<h1>ページの見出しです</h1>
<p>リード文です</p>
ブラウザの表示
@stop
@stopとは何か?
@stopは@endsectionと同じです。
@sectionと@stopの間にコードを記述することで、対象となる@yieldに指定したコードを丸ごと渡すことができます。
@section('セクション名') コード @stop
@stopは@endsectionはどちらを使っても処理は変わりません。入力する文字数の短さを優先するなら@stop、処理内容を明示的にするには@endsectionを使うといった違いです。
実例
例えば、「views > template > heading.blade.php」というパスの「heading.blade.php」ファイルに@yield('header')
と記載してあるとします。
<body>
@yield('header')
</body>
これは、@extendsで呼び出されたときに、そのファイルに@sectionでセクション名「header」の内容を表示するという記述です。
この「heading.blade.php」を「views > index.blade.php」で@extendsで呼び出します。
@extends('template.heading')
このままでは、呼び出した内容は<body>@yield('header')</body>
のままです。
この@yieldに内容を渡すための@sectionを追記します。
@extends('template.heading')
@section('header')
<h1>ページの見出しです</h1>
<p>リード文です</p>
@stop
こうすることで、@yieldのセクション名「header」に対象となる@sectionと@stopで囲まれた部分のコードが入ります。
「index.blade.php」のコンパイル結果は以下のようになります。
<h1>ページの見出しです</h1>
<p>リード文です</p>
ブラウザの表示
@show
@showとは何か?
@showで@sectionを閉じると、@sectionを記述してある場所にその内容を表示します。
@section('セクション名') コード @show
実例:@yieldが無い場合
対象となる@yieldがなく、@section ~ @showが記載されている場合は、@sectionに記載されている内容がそのまま表示されます。
@section('header')
<h1>ページタイトル</h1>
<p>リード文です</p>
@show
ブラウザの表示
実例:@yieldが有る場合
例えば、「views > template > heading.blade.php」というパスの「heading.blade.php」ファイルに@yield('header')
と記載してあるとします。
<body>
@yield('header')
</body>
これは、@extendsで呼び出されたときに、そのファイルに@sectionでセクション名「header」の内容を表示するという記述です。
この「heading.blade.php」を「views > index.blade.php」で@extendsで呼び出します。
@extends('template.heading')
このままでは、呼び出した内容は<body>@yield('header')</body>
のままです。
この@yieldに内容を渡すための@sectionを追記します。この時にディレクティブの終了を@showとします。
@extends('template.heading')
@section('header')
<h1>ページの見出しです</h1>
<p>リード文です</p>
@show
<hr>
すると、@yieldのセクション名「header」に対象となる@sectionと@showで囲まれた部分のコードが入ります。
更に、@sectionの内容が記述されている場所にも表示されます。
「index.blade.php」のコンパイル結果は以下のようになります。
<h1>ページの見出しです</h1>
<p>リード文です</p>
<hr>
<h1>ページの見出しです</h1>
<p>リード文です</p>
ブラウザの表示
@sectionの内容が2回表示されていることがわかります。
なお、上側が@section ~ @showの内容で、下側が@yieldの内容です。
試しに、@extendsの記述を削除して「index.blade.php」を以下のようにします。
@section('header')
<h1>ページの見出しです</h1>
<p>リード文です</p>
@show
<hr>
すると、hrの線よりも上の要素だけが残ります。