【Laravel 5.6】assetの管理を@sectionと@stackのどちらを使うか?

環境

PHP 7.1
Laravel 5.6
Bladeテンプレート

目的

Laravelのbladeでテンプレートを作成していた時に、javascriptやcssなどの管理をどのようにするのかドキュメントを見てもよく分からなかったので、整理するために調査。

テンプレートの構成としては2階層か3階層のテンプレート構成で作ることが多いので、その2パターンで比較します。

2階層テンプレート

構成は以下を想定

app.blade.php
     └ index.blade.php

app.blade.php

<html>
  <header>
    @section('section-scripts')
      <script>console.log('app-section-scripts');</script>
    @show
    @stack('stack-scripts')
  </header>
  <body>
    @yield('contents')
  </body>
</html>

index.blade.php

@extends('app')

@section('section-scripts')
  @parent
  <script>console.log('index-section-scripts');</script>
@endsection

@push('stack-scripts')
  <script>console.log('index-stack-scripts push');</script>
@endpush

@prepend('stack-scripts')
  <script>console.log('index-stack-scripts prepend');</script>
@endprepend

実行結果

予想通りの結果でした。まあ単純なので当たり前ですね。

app-section-scripts
index-section-scripts
index-stack-scripts prepend
index-stack-scripts push

3階層テンプレート

構成は以下を想定

app.blade.php
└ index.blade.php

app.blade.php

<html>
  <header>
    @section('section-scripts')
      <script>console.log('app-section-scripts');</script>
    @show
    @stack('stack-scripts')
  </header>
  <body>
    @yield('contents')
  </body>
</html>

layout.blade.php

@extends('app')

@section('section-scripts')
  @parent
  <script>console.log('layout-section-scripts');</script>
@endsection

@push('stack-scripts')
  <script>console.log('layout-stack-scripts push');</script>
@endpush

@prepend('stack-scripts')
  <script>console.log('layout-stack-scripts prepend');</script>
@endprepend

index.blade.php

@extends('layout')

@section('section-scripts')
  @parent
  <script>console.log('index-section-scripts');</script>
@endsection

@push('stack-scripts')
  <script>console.log('index-stack-scripts push');</script>
@endpush

@prepend('stack-scripts')
  <script>console.log('index-stack-scripts prepend');</script>
@endprepend

実行結果

自信ないけど私の予想。(2階層目と3階層目の@prependはどうなるんだ??)

app-section-scripts
layout-section-scripts
index-section-scripts
layout-stack-scripts prepend
index-stack-scripts prepend
layout-stack-scripts push
index-stack-scripts push

結果

app-section-scripts
layout-section-scripts
index-section-scripts
index-stack-scripts prepend
layout-stack-scripts prepend
index-stack-scripts push
layout-stack-scripts push

予想外の結果となりました。どうも3階層目のテンプレートから判定されて行ってるようです。
これ、どうコントロールするのが正しいのか誰か教えて!

結論

2階層テンプレートの場合は、@stackを使う方が管理しやすい。いちいち@parentを書く必要もないし。共通は、app.blade.phpに直接記載し、追加分をstackでコントロールする感じかな。

3階層テンプレートになると、@stackは希望する動作にはならないし、どのような順番になるのかがソースでは分からないので@sectionを使用する。

以上がベストかな。