【Laravel】@endsectionと@stopの違いは何か?@showは何か?使い方を実例で確認(@section)

laravel-prograshi(プロぐらし) Laravel
記事内に広告が含まれていることがあります。

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
注意点

@section ~ @showに該当する、セクション名を記載した@yieldがある場合、@yieldがある場所と、@sectionにそれぞれ同じ内容が表示されます。


実例:@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>
注意点

@yieldで呼び出した内容は、@section @showの下側(ページ内の要素の一番最後)に表示されます。


ブラウザの表示

@sectionの内容が2回表示されていることがわかります。

なお、上側が@section ~ @showの内容で、下側が@yieldの内容です。


試しに、@extendsの記述を削除して「index.blade.php」を以下のようにします。

@section('header')
 <h1>ページの見出しです</h1>
 <p>リード文です</p>
@show

<hr>

すると、hrの線よりも上の要素だけが残ります。


タイトルとURLをコピーしました