概要
ディレクティブ(directive)はBladeテンプレート内に記述し、テンプレート内でPHPの処理・制御をおこなったり、共通のレイアウトを扱うといった処理を指示する。
ディレクティブは@キーワード
のように書き、そのキーワードに応じて必要な表現が続く。
ロジック制御系ディレクティブ
分岐系ディレクティブ
@if
1 2 3 4 5 6 7 |
@if (条件) ..... @elseif (条件) ..... @else ..... @endif |
@unless
1 2 3 4 5 |
@unless (条件) ..... @else ..... @endunless |
@empty
1 2 3 4 5 |
@empty (変数) ..... @else ..... @endempty |
@isset
1 2 3 4 5 |
@isset (変数) ..... @else ..... @endisset |
ループ系ディレクティブ
@for
1 2 3 |
@for (初期条件; 終了条件; 変更) ..... @endfor |
@foreach
1 2 3 |
@foreach (コレクション as 変数) ..... @endforeach |
@forelse…@empty
1 2 3 4 5 |
@forelse (コレクション as 変数) ....コレクションがemptyでない場合 @empty ....コレクションがemptyの場合 @endfor |
@while
1 2 3 |
@while (継続条件) ..... @endwhile |
@break
PHPのbreak
と同じ使い方。
@continue
PHPのcontinue
と同じ使い方。
$loop変数
$loop->index |
現在のインデックス(0, 1, 2, …) |
$loop->iteration |
現在の繰り返し数(1, 2, 3, …) |
$loop->remaining |
あと何回繰り返すか |
$loop->count |
配列の要素数 |
$loop->first |
繰り返しの最初かどうか |
$loop->last |
繰り返しの最後かどうか |
$loop->depth |
繰り返しのネストの深さ |
$loop->parent |
ネストしている場合の親のループ変数 |
共通化・再利用関係ディレクティブ
レイアウト関係ディレクティブ
レイアウト関係はこちらにまとめている。
@extends/@yields/@section
@extends
でレイアウトとして使う親のビューを指定@yield
で個別ビューで埋めるべきプレースホルダーを指定- 個別ビューやサブレイアウトで@sectionを指定し、対応する
@yield
を具体の内容で埋める
@show
@parent
部分HTML関係ディレクティブ
@include
@include
ディレクティブは、別に準備された共通の部分ビューをその場所に読み込む。第2引数に連想配列を指定して、引数を渡すことができる。
1 2 3 |
@include('ビュー') @include('ビュー', 連想配列) |
例として、以下は共通して読み込まれる部分ビュー。
1 2 3 4 5 6 |
{{-- view/samples/include_sub.blade.php --}} <ul> <li>inludeされた共通HTML</li> <li>{{ $item }}</li> </ul> |
そして以下は、@include
で上のHTMLを読み込むビュー。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
{{-- view/samples/include_sumple.blade.php --}} <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>@includeサンプル</title> </head> <body> <h1>@includeサンプル</h1> <p>以下は1つ目の@include。</p> @include('samples.include_sub', ['item' => '1つ目の@include']) <p>以下は2つ目の@include。</p> @include('samples.include_sub', ['item' => '2つ目の@include']) </body> </html> |
@component/@slot
@include
と同じように共通の部分ビューを読み込むが、変数を指定するのに連想配列で渡す方法と@slot
ディレクティブで指定する方法がある。
1 2 3 4 5 6 7 8 |
@component('ビュー', 連想配列) @component('ビュー') @slot('変数名') 部分HTML @endslot ..... @endcomponent |
以下は@component
で読み込まれる部品側のファイル。
1 2 3 4 |
{{-- views/samples/component_example.blade.php --}} <h3>{{ $os_title }}</h3> <p>{{ $os_list }}</p> |
そして以下は、この部品を読み込んで使う親のファイル。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
{{-- views/samples/component_sample.blade.php --}} <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>@componentサンプル</title> </head> <body> <h1>@componentのサンプル</h1> @component('samples.component_example') @slot('os_title') 使用中のOS @endslot @slot('os_list') <li>Windows10</li> <li>CentOS7</li> <li>AmaxonLinux2</li> <li>DewwBSD</li> @endslot @endcomponent </body> </html> |
@each
@each
ディレクティブは、配列やコレクションの内容を取り出しながら、その内容を繰り返してビューに適用していく。
1 2 3 |
@each('ビュー', コレクション, '変数名') @each('ビュー', コレクション, '変数名', 'ビュー2') |
ビュー2はコレクションが空のときに使われるビュー。
たとえば以下のような部分ビューを準備しておいて、
1 2 3 |
{{-- views/samples/each_sub.blade.php --}} <li>{{ $item }}</li> |
以下のように@each
を使うことで、配列の要素1つずつに同じ部分ビューの内容を適用させることができる。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
{{-- views/samples/each_sample.blade.php --}} <!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title>@eachサンプル</title> </head> <body> <h1>@eachのサンプル</h1> <h1>使用しているOS</h1> @php $os_list = ['Windows10', 'CentOS7', 'AmazonLinux2', 'FreeBSD']; @endphp <ul> @each('samples.each_sub', $os_list, 'item') </ul> </body> </html> |
この結果、@componentの時と同じようなリストが配列の要素に対応して作られる。
@import/@component/@eachの使い分け
これら3つを使い分けるシーンについて、以下のように考えてみた。
@import
- ある程度の規模の定型部分ビューの一部を変数で与えながら再利用する場合。
@component
- 個別ビューでHTMLの一部を設定しながら一定の構造を持たせる場合。
@each
- コレクションの内容に応じたリスト項目の表示など、部分HTMLに対して定型で内容が変化する場合。