Laravelを使用していると「ブレード」あるいは「ブレードテンプレート」という言葉をよく耳にする。
ブレードとは何か?
Laravelで使用しているテンプレートエンジン。
テンプレートエンジンとは、HTMLとデータ(PHPやJSなど)を組み合わせて出力ようのHTMLファイルを作成するライブラリのこと。
ブレードは.blade.php
という拡張子のファイルで、HTMLとPHPを合わせて記述することができる。
このファイルをブレードテンプレートと呼ぶ。
▼ブレードテンプレートの例
HTMLの中でif文を使うなど。
<div>
<table>
@if ($table->getColgroup())
<colgroup>
@if ($table->getColgroup())
@foreach ($table->getColgroup()->getCols() as $col)
<col width="{{ $col->getWidth() ?: 'auto'}}">
@endforeach
@endif
</colgroup>
@endif
</table>
</div>
divタグやtableタグと、@if
や@foreach
などphpのコードが混ざっている。
ブレードテンプレートの保存場所
resources/views配下に保存する。
viewsフォルダの中に、.blade.phpファイルが格納されている。
ブレードテンプレートの呼び出し
グローバルに定義されているviewヘルパーで呼び出す。
・view('ブレードテンプレート名', ['変数名' => '値'])
┗ 第2引数で指定した変数に値を代入して渡す
▼viewヘルパーの使用例
Route::get('/', function () {
return view('greeting', ['name' => 'James']);
});
Routeファサードのgetメソッドで/
のパスにアクセスした場合に、greeting.blade.phpを返す。
その際、値Jamesを格納した変数nameを渡す。この文法をブレードシンタックスと呼ぶ。
▼対象のブレード例
Hello, {{ $name }}.
「Hello, James.」が表示される。
・{{ }}の意味
すべて文字列として出力する特殊なecho文。
XSS attack防止仕様(スクリプトを実行しない。)
・{!! !!}の意味
{{ }}と異なりエスケープせずそのまま出力する。
タグを出力したい場合など、こちらを使う。
XSS attack防止のため、ユーザーが入力した内容を出力する場合は{{ }}を使う。
・{{– –}}の意味
コメントアウト。
@ブレードディレクティブ
ブレードテンプレート内で@をつけることで、phpの処理を実行することができる。(コードの省略表記)
@if
, @for
, @json
など多数ある。
この@をブレードディレクティブと呼ぶ。
@jsonディレクティブ
ブレードテンプレートで簡単にjson形式のデータが入ったデータの呼び出しができる。
<script>
var app = @json($array);
</script>
ディレクティブを使わない通常表記は下記。
<script>
var app = <?php echo json_encode($array); ?>;
</script>
@json
ディレクティブの呼び出しデータを整形する
第2引数で指定の指示(定義済み定数)を与えると、呼び出したデータを整形できる。
・@json($変数名, 定義済み定数)
▼主な定義済み定数
定義済み定数 | 内容 |
---|---|
JSON_PRETTY_PRINT | 返される結果の書式を、スペースを使って整形 |
JSON_HEX_TAG | すべての < および > をそれぞれ \u003C および \u003E に変換 |
JSON_NUMERIC_CHECK | 数値形式の文字列を数値としてエンコード |
@@ブレードディレクティブのエスケープ
@を2つつけるとブレードディレクティブのエスケープとなる。
@@json
↓ コンパイル結果
@json
@includeディレクティブ
ブレードビュー内で別のビューを呼び出す。
<div>
@include('shared.errors')
<form>
<!-- Form Contents -->
</form>
</div>
@include('shared.errors')
の部分に、shared.errors.blade.phpが表示される。
viewヘルパーと同じく、第二引数でデータを渡すことができる。
・@include('view.name', ['status' => 'complete'])
view.name.blade.phpを読み込む。その際、completeというデータを変数$statusで渡す。
※注意
存在しないビューファイルを指定した場合はエラーになる。
@includeif
存在しない可能性のあるファイルを指定する場合は、@includeif
を使う。
@includeIf('view.name', ['status' => 'complete'])
参考リンク
Laravelには@includeや@inlcudeif以外にも様々なディレクティブが用意されています。
【Laravel】@extendsと@includeの違いは何か? @includeif, @includeWhen, @includeUnlessの使い方を実例で解説