はじめに

Laravel で @section の設定がある場合のみ HTML を表示する方法を整理した。

例えば「共通的に使うので、レイアウトファイルにパンくずリストを定義したい」けど、「パンくずリストの表示指定が無いページでは、パンくずリスト自体を表示したくない」のようなケース。
※わかりやすい例が思いつかない。

TL;DR

  • @hasSection を使う
  • 複合条件の場合は @ifView::hasSection を組み合わせて対応

目次

  1. はじめに
  2. TL;DR
  3. 環境・条件
  4. 詳細
    1. Tips: 「2つのうち片方が設定されている場合」のようなケース
  5. まとめ
  6. その他・メモ
  7. 参考文献

環境・条件

1
2
3
4
5
6
7
8
9
10
11
12
$ grep -i pretty /etc/os-release
PRETTY_NAME="Ubuntu 16.04.3 LTS"

$ php -v
PHP 7.2.22-1+ubuntu16.04.1+deb.sury.org+1 (cli) (built: Sep 2 2019 12:54:12) ( NTS )

$ composer -V
Composer version 1.9.0 2019-08-02 20:55:32

$ composer info laravel/framework
name : laravel/framework
versions : * v5.7.28

詳細

@hasSection を使う。


レイアウトファイル、section_header を読み込んで content を表示。

resources/views/layouts/app.blade.php

1
2
3
4
<main>
@include('section_header')
@yield('content')
</main>

section_header では、@hasSection を使って sectionTitle が定義されていればその内容を、そうでなければ タイトル未設定 を表示。

resources/views/section_title.blade.php

1
2
3
4
5
6
7
@section('section_header')
@hasSection('sectionTitle')
<h1>yield('sectionTitle')</h1>
@else
<h1>タイトル未設定</h1>
@endif
@show

view ファイルでは、@section('sectionTitle', 'XXXX') で設定。

resources/views/hoge.blade.php

1
2
3
4
5
6
@section('sectionTitle', 'My Title')
@section('content')
<div class="hoge">
hoge
</div>
@endsection

最終的に出力される HTML は次の通り。

1
2
3
4
5
6
<main>
<h1>My Title</h1>
<div class="hoge">
hoge
</div>
</main>

@section('sectionTitle', 'XXXX') を設定しない場合。

resources/views/fuga.blade.php

1
2
3
4
5
@section('content')
<div class="fuga">
fuga
</div>
@endsection

最終的に出力される HTML は次の通り。

1
2
3
4
5
6
<main>
<h1>タイトル未設定</h1>
<div class="fuga">
fuga
</div>
</main>

Tips: 「2つのうち片方が設定されている場合」のようなケース

「どちらか片方が設定されていれば〜」のような条件の場合は @section では対応できないので @ifView::hasSection を組み合わせて対応。

1
2
3
4
5
@section('section_header')
@if (View::hasSection('sectionTitle') || View::hasSection('sectionSubtitle'))
<h1>yield('sectionTitle') - yield('sectionSubtitle')</h1>
@endif
@show

まとめ

  • @hasSection を使う
  • 複合条件の場合は @ifView::hasSection を組み合わせて対応

その他・メモ

関連: Laravel で view からレイアウトファイルにデータを渡す方法

参考文献

関連記事