Skip to main content

はじめに

BladeはLaravelに含まれるシンプルかつ強力なテンプレートエンジンです。 PHPのテンプレートエンジンの一部と異なり、Bladeはテンプレート内で素のPHPコードの使用を制限しません。 すべてのBladeテンプレートはPHPコードにコンパイルされてキャッシュされるため、Bladeはアプリケーションにほとんどオーバーヘッドを加えません。 Bladeテンプレートファイルは .blade.php 拡張子を使い、通常は resources/views ディレクトリに格納されます。

Bladeコンパイルフロー

.blade.php ファイルがどのようにHTMLレスポンスに変換されるかを示します。一度コンパイルされたファイルはキャッシュされるため、同一テンプレートの2回目以降のリクエストはコンパイルをスキップします。

データの表示

Bladeビューに渡されたデータを表示するには、変数を二重の波括弧で囲みます。
Bladeの {{ }} は自動的にPHPの htmlspecialchars 関数を通してXSS攻撃を防ぎます。
変数だけでなく、PHP関数の結果も表示できます。

エスケープしないデータの表示

エスケープを省略したい場合は {!! !!} 構文を使います。
ユーザーが入力したデータを表示するときは、必ず {{ }} を使って自動エスケープを有効にしてください。 {!! !!} を信頼できない入力に使うとXSS脆弱性につながります。

JavaScriptフレームワークとの共存

JavaScriptフレームワークも波括弧を使う場合は、@ シンボルでBladeのレンダリングをスキップさせます。
この場合、@ はBladeによって除去されますが、{{ name }} はそのままブラウザに送られてJavaScriptフレームワークによってレンダリングされます。
Bladeを中心に進めるか、LivewireやInertiaへ広げるかを比較したい場合は フロントエンド を参照してください。

Bladeディレクティブ

条件分岐(if文)

@unless で「〜でなければ」という条件も書けます。
変数が定義されているか・nullでないかを確認するには @isset@empty を使います。

認証ディレクティブ

Switch文

ループ

Bladeはループを扱うための便利なディレクティブを提供します。
ループ内では @break@continue を使ってループを制御できます。
条件を直接ディレクティブに渡すこともできます。

ループ変数

@foreach ループ内では、$loop 変数を使ってループに関する情報を取得できます。

コメント

Bladeコメントはレンダリングされたページに含まれません。

レイアウト

コンポーネントを使ったレイアウト

Laravelのレイアウト構築には、Bladeコンポーネントを使う方法が推奨されます。 まずレイアウトコンポーネントを作成します。
次にこのレイアウトを使うビューを作ります。

テンプレート継承を使ったレイアウト

古典的な方法として、@extends@section@yield を使ったテンプレート継承があります。 親レイアウトの定義:
子ビューでのレイアウト継承:
@parent を使うと、親レイアウトの @section の内容を維持しながら追記できます。

サブビューのインクルード

@include ディレクティブを使うと、Bladeビューを別のビューに埋め込めます。 親ビューで利用可能なすべての変数は、インクルードされたビューでも利用できます。
変数を追加で渡すこともできます。

フォームのCSRF保護

web ルートファイルで POSTPUTPATCHDELETE リクエストを送るHTMLフォームには、必ず @csrf ディレクティブを含めてください。
PUTPATCHDELETE リクエストをフォームから送る場合は @method ディレクティブを使います。
Origin検証や X-CSRF-TOKEN / X-XSRF-TOKEN ヘッダーを含む実運用のCSRF対策は CSRFプロテクション を参照してください。

まとめ

Bladeテンプレートエンジンの主な機能をまとめます。
{{ $variable }} でエスケープ付き表示、{!! $variable !!} でエスケープなし表示。
@if@elseif@else@endif@unless@isset@empty@auth@guest
@for@foreach@forelse@while$loop 変数を使った制御。
コンポーネントベース(<x-layout>{{ $slot }})またはテンプレート継承(@extends@section@yield)。
@include でビューを再利用可能なパーツとして埋め込み。
最終更新日 2026年5月27日