Blade構文(@if, @foreach, @extends, @sectionなど)

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)

blade
<!doctype html> <html> <head> <title>@yield('title') - Demo</title> </head> <body> <header>@include('partials.nav')</header> <main> @yield('content') </main> @stack('scripts') </body> </html>

例:子ビュー

blade
@extends('layout.master') @section('title', '記事一覧') @section('content') <h1>記事一覧</h1> @foreach ($posts as $post) <article>{{ $post->title }}</article> @endforeach @endsection @push('scripts') <script src="/js/post-list.js"></script> @endpush

3. 制御構文ディレクティブ

3.1 条件分岐

ディレクティブ 意味 備考
@if (条件)@endif 通常の条件分岐 @elseif, @else も使用可
@unless (条件)@endunless 条件が のときに実行 ! を書くより読みやすい
@isset ($var)@endisset 変数が定義済み null 判定含む
@empty ($var)@endempty 変数が空のとき

blade
@isset($user) こんにちは、{{ $user->name }} さん @else <a href="/login">ログイン</a> @endisset

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 変数の例

blade
@foreach ($posts as $post) <div>{{ $loop->iteration }}: {{ $post->title }}</div> @if ($loop->last) <p>最後の要素です</p> @endif @endforeach

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. ベストプラクティスと注意点

  1. ロジックは最小限に
    Blade はビューの責務に集中させ、複雑な計算や DB 取得はコントローラー/サービス層で行う。

  2. 自動エスケープを信頼する
    基本は {{ }} を用い、{!! !!} は扱うデータが完全に信頼できる場合のみ使用。

  3. レイアウト・コンポーネントで重複を排除
    画面横断で同じヘッダーやアラートを持つ場合はテンプレート継承・スタックや Blade コンポーネントで共通化する。

  4. ループ最適化
    大規模配列をそのまま @foreach で回すとメモリを圧迫することがある。必要に応じてストリーミングレスポンス等を検討。


まとめ

Blade はシンプルなディレクティブでテンプレート継承・条件分岐・ループ処理を実現しつつ、PHP の柔軟性も残した強力なビュー層を提供します。上記の基本ディレクティブを押さえれば、生産性と保守性の高い Laravel アプリのフロントエンドを実装できます。

ChatGPT4o 生成日:2025/06/23