1. Blade テンプレートとは
Blade は Laravel に標準搭載されている軽量テンプレートエンジンです。
PHP をそのまま書ける柔軟性を保ちつつ、テンプレート継承・制御構文・自動エスケープなどを簡潔なディレクティブ(@~)で提供します。
2. テンプレート継承系ディレクティブ
| 目的 | 主なディレクティブ | 解説 & 例 |
|---|---|---|
| レイアウトの継承 | @extends('layout.master') |
指定レイアウトを親テンプレートとして継承し、後述の @section を親の @yield に差し込みます。 |
| セクション定義 | @section('title') … @endsection |
レイアウト側で @yield('title') を置いた箇所に内容を注入。@show で即時出力も可能。 |
| 内容の追加 | @parent |
親セクション内容を保持したまま追記したい場合に使用。 |
| 区切り出力 | @yield('content', 'デフォルト') |
セクションが未定義なら第 2 引数を出力。 |
| スタック制御 | @push('scripts') … @endpush / @stack('scripts') |
複数箇所から配列的に追記し、レイアウト側でまとめて出力。ヘッダー/フッターに JS・CSS を注ぎ足す際に便利。 |
例:親レイアウト (layout/master.blade.php)
例:子ビュー
3. 制御構文ディレクティブ
3.1 条件分岐
| ディレクティブ | 意味 | 備考 |
|---|---|---|
@if (条件) … @endif |
通常の条件分岐 | @elseif, @else も使用可 |
@unless (条件) … @endunless |
条件が 偽 のときに実行 | ! を書くより読みやすい |
@isset ($var) … @endisset |
変数が定義済み | null 判定含む |
@empty ($var) … @endempty |
変数が空のとき |
例
3.2 ループ
| ディレクティブ | 用途 | 特徴 |
|---|---|---|
@foreach ($items as $item) … @endforeach |
コレクション反復 | $loop 変数でインデックス・最初/最後判定など可 |
@for ($i = 0; $i < 10; $i++) … @endfor |
伝統的 for ループ | |
@while (条件) … @endwhile |
while ループ | |
@forelse ($items as $item) … @empty … @endforelse |
空配列時のフォールバック出力 |
$loop 変数の例
4. 出力とエスケープ
| 構文 | 動作 | 用途 |
|---|---|---|
{{ $var }} |
HTML エスケープして出力 | XSS 防止が既定 |
{!! $var !!} |
エスケープせずそのまま出力 | 信頼できる HTML 断片を埋め込む場合のみ |
@{{ ... }} |
Vue 等で {{ }} と書きたいときにその場をエスケープ |
5. インクルード・コンポーネント
| 区分 | 主なディレクティブ | ポイント |
|---|---|---|
| 部品呼び出し | @include('view', ['key' => $val]) |
部分テンプレートを単純に埋め込む |
| 条件付き include | @includeIf, @includeWhen, @includeFirst |
ビュー存在判定や最初に見つかったものを使用 |
| リスト描画 | @each('view', $items, 'item', 'view.empty') |
反復 + 空状態ビューを 1 行で |
| コンポーネント | <x-alert type="error">…</x-alert> / @component('...') |
Blade コンポーネント・スロット機能で再利用性を向上 |
6. フォーム補助ディレクティブ
| 目的 | ディレクティブ | 説明 |
|---|---|---|
| CSRF トークン埋め込み | @csrf |
<input type="hidden" name="_token" …> を自動生成 |
| PUT / PATCH / DELETE メソッド指定 | @method('PUT') |
名前付きルートへ正しい HTTP 動詞を送る際に使用 |
7. その他便利機能
-
コメント :
{{-- コメント --}}は HTML 出力されない。 -
PHP ブロック :
@php … @endphpで複雑なロジックを書くことも可能(ロジックはコントローラー側へ寄せるのが推奨)。 -
ディレクティブの自作 :
Blade::directive('datetime', function ($exp) { return "<?php echo ($exp)->format('Y/m/d'); ?>"; });などサービスプロバイダで定義。
8. ベストプラクティスと注意点
-
ロジックは最小限に
Blade はビューの責務に集中させ、複雑な計算や DB 取得はコントローラー/サービス層で行う。 -
自動エスケープを信頼する
基本は{{ }}を用い、{!! !!}は扱うデータが完全に信頼できる場合のみ使用。 -
レイアウト・コンポーネントで重複を排除
画面横断で同じヘッダーやアラートを持つ場合はテンプレート継承・スタックや Blade コンポーネントで共通化する。 -
ループ最適化
大規模配列をそのまま@foreachで回すとメモリを圧迫することがある。必要に応じてストリーミングレスポンス等を検討。
まとめ
Blade はシンプルなディレクティブでテンプレート継承・条件分岐・ループ処理を実現しつつ、PHP の柔軟性も残した強力なビュー層を提供します。上記の基本ディレクティブを押さえれば、生産性と保守性の高い Laravel アプリのフロントエンドを実装できます。
ChatGPT4o 生成日:2025/06/23