Laravel

【Laravel】テンプレートエンジン「Blade」の構文

2019/12/23

LaravelのBladeテンプレートの基本構文をまとめます。

if, for, foreach, whileなど、一通りの構文が揃っているので、不自由はなさそうな印象ですが、果たして。
Smartyより使いやすいテンプレートエンジンであることを祈る…!

Bladeの構文 / データ表示

(自動的に)エスケープする

値を埋め込む(表示する)には「{{ }}」を用います。
Bladeの{{ }}記法はXSS対策として、自動的にPHPのhtmlspecialchars関数を通しエスケープ処理されます。

エスケープしない

{{ }}は自動的にエスケープされますが、エスケープ処理されてほしくない場合は {{!! … !!}} を用います。

コメント

{{-- --}} で書かれたテキストはコメントとして扱われます。

改行を含む場合

改行が含まれる値を表示したいときは、以下のように記述します。
e() はヘルパ関数で、htmlspecialchars関数を実行します。

実例

アクション
プロジェクトディレクトリ\app\Http\Controllers\HelloController.php

テンプレート
プロジェクトディレクトリ\resources\views\hello\newline.blade.php

ルーティング
プロジェクトディレクトリ\routes\web.php

結果

制御構文

if文

if文の構文には、@if、@elseif、@else、@endifディレクティブを使用します。
これらの使い方はPHPの構文と同じです。

条件がTRUEの場合に表示する

条件によって異なる表示をする

複数の条件を設定する

条件がFALSEの場合に表示する

if文と逆なので、@elseを用意した場合は条件がTRUEの場合に表示します。

変数が空の場合に表示

条件とした変数が空の場合に表示を行います。
@elseを用意した場合は、変数が空でない(値が設定されている)ときに表示されます。

変数が定義済みの場合に表示

変数そのものが定義済みかどうかを確認します。変数が定義済みかつ、nullではない場合に表示します。
@elseを用意した場合は、変数が未定義だったときに表示します。

実例

アクション
プロジェクトディレクトリ\app\Http\Controllers\HelloController.php

テンプレート
プロジェクトディレクトリ\resources\views\hello\if.blade.php

ルーティング
プロジェクトディレクトリ\routes\web.php

結果

switch文

@switch、@case、@break、@default、@endswitchディレクティブを使用し、switch文を構成できます。

実例

アクション
プロジェクトディレクトリ\app\Http\Controllers\HelloController.php

テンプレート
プロジェクトディレクトリ\resources\views\hello\switch.blade.php

ルーティング
プロジェクトディレクトリ\routes\web.php

結果

繰り返し

for文

基本的にPHPのfor文と変わりなしですね。

実例

アクション
プロジェクトディレクトリ\app\Http\Controllers\HelloController.php

テンプレート
プロジェクトディレクトリ\resources\views\hello\for.blade.php

ルーティング
プロジェクトディレクトリ\routes\web.php

結果

foreach文

実例

アクション
プロジェクトディレクトリ\app\Http\Controllers\HelloController.php

テンプレート
プロジェクトディレクトリ\resources\views\hello\foreach.blade.php

ルーティング
プロジェクトディレクトリ\routes\web.php

結果

foreach-else

foreach文にelseを追加した場合の処理です。
配列から順に値を取り出して処理を繰り返していく点は @foreach と同じです。
値をすべて取り出し終え、取り出せなくなった時に @empty にある処理を実行して繰り返しを終了します。

while文

引数に条件を設定し、その条件がtrueの場合に表示を行います。
whileでは、実行時に条件で使っている変数などの値が変化しなければ、無限ループとなってしまうため、ディレクティブ内で何らかの処理を実行する必要があるので注意。

おお、なんてサンプルンなんだ…。

@breakと@continue

PHPの繰り返し構文ではbreakやcontinueといった制御が可能ですが、Bladeにも同様のワードが用意されており、制御が可能です。
繰り返しを使用する場合、ループを終了するか、現在の繰り返しをスキップすることもできます。

@break

@breakが出現した時点で繰り返しディレクティブが中断されます。

実例

アクション
プロジェクトディレクトリ\app\Http\Controllers\HelloController.php

テンプレート
プロジェクトディレクトリ\resources\views\hello\break.blade.php

ルーティング
プロジェクトディレクトリ\routes\web.php

結果

@continue

条件が当てはまる時にループをスキップします。

実例

アクション
プロジェクトディレクトリ\app\Http\Controllers\HelloController.php

テンプレート
プロジェクトディレクトリ\resources\views\hello\continue.blade.php

ルーティング
プロジェクトディレクトリ\routes\web.php

結果

↑ 3番目の「Charlie」が抜けています

渡す配列を、オブジェクトにするテスト

Blade構文の例にあるように、オブジェクトで制御する方法です。
余談ですが、最近のフレームワークではDBの結果がオブジェクト形式で帰ってくるなどの例がありますが、PHPの場合は自力で作成する場合は連想配列のほうが使い勝手が良さそうな気がしますね。

アクション
プロジェクトディレクトリ\app\Http\Controllers\HelloController.php

テンプレート
プロジェクトディレクトリ\resources\views\hello\continue_obj.blade.php

ルーティング
プロジェクトディレクトリ\routes\web.php

結果

↑ 4番目の「Daniel」が抜けています

ループ変数

繰り返し中は、$loop変数が使用できます。この変数により、現在のループインデックスや繰り返しの最初/最後なのかなど、便利な情報にアクセスできます。
Smartyでもありましたね、これ。

プロパティ 説明
$loop->index 現在のループのインデックス(初期値0)
$loop->iteration 現在の繰り返し数(初期値1)
$loop->remaining 繰り返しの残り数
$loop->count 繰り返し中の配列の総アイテム数
$loop->first ループの最初の繰り返しか判定
$loop->last ループの最後の繰り返しか判定
$loop->even これは偶数回目の繰り返しか判定
$loop->odd これは気数回目の繰り返しか判定
$loop->depth 現在のループのネストレベル
$loop->parent ループがネストしている場合、親のループ変数

@foreachを二重に(ネスト)した場合では、親のループの$loop変数にparentプロパティを通じアクセスできます。

PHP

PHPコードをビューへ埋め込むと便利な場合もあります。
Bladeの@phpディレクティブを使えば、テンプレートの中でプレーンなPHPブロックを実行できます。

参考にしたサイト

迷ったら公式。

-Laravel
-, , , , ,