Laravel

Laravel Bladeテンプレート入門|基本構文とレイアウト

Bladeは、Laravelに標準搭載されたテンプレートエンジンです。PHPの制御構文をシンプルなディレクティブ(@if@foreach等)で記述でき、レイアウトの継承や部分テンプレートの読み込みも簡単に行えます。この記事では、Bladeの基本構文からレイアウト継承まで、実践的な使い方を解説します。

Bladeテンプレートとは

Bladeテンプレートは、拡張子が.blade.phpのファイルで、resources/views/ディレクトリに配置します。通常のPHPとHTMLをそのまま書くこともできますが、Blade独自のディレクティブを使うことで、より簡潔で読みやすいコードを書くことができます。

コントローラーから渡された変数をビューに表示したり、条件分岐やループ処理を行ったりする際に、Bladeのディレクティブが活躍します。

ポイント

Bladeテンプレートは最終的にPHPコードにコンパイルされてキャッシュされるため、パフォーマンスへの影響はほとんどありません。

変数の表示

コントローラーから渡された変数を表示するには、二重波括弧{{ }}を使います。この記法はHTMLエンティティを自動的にエスケープするため、XSS攻撃を防ぐことができます。

blade.php
<!-- エスケープ付き表示(推奨) -->
{{ $variable }}

<!-- エスケープなし表示(HTML出力時) -->
{!! $htmlContent !!}

<!-- デフォルト値の設定 -->
{{ $name ?? 'ゲスト' }}
注意

{!! !!}はHTMLをそのまま出力するため、ユーザー入力を表示する場合は必ず{{ }}を使用してください。XSS脆弱性の原因になります。

条件分岐

Bladeでは@ifディレクティブを使って条件分岐を記述します。PHPのif文と同じロジックですが、より簡潔に書くことができます。

blade.php
@if($user->isAdmin())
    <div class="admin-badge">管理者</div>
@elseif($user->isMember())
    <div class="member-badge">メンバー</div>
@else
    <div class="guest-badge">ゲスト</div>
@endif

@isset($user)
    <p>ユーザー: {{ $user->name }}</p>
@endisset

@empty($users)
    <p>ユーザーがいません</p>
@endempty

@issetは変数が定義されていてnullでないかをチェックし、@emptyは変数が空かどうかをチェックします。これらを使い分けることで、より堅牢なテンプレートを作成できます。

繰り返し処理

コレクション(配列やEloquentコレクション)をループして表示する場合は、@foreachディレクティブを使います。

blade.php
@foreach($employees as $employee)
    <div class="card">
        <h3>{{ $employee->name }}</h3>
        <p>{{ $employee->department->name }}</p>
    </div>
@endforeach

@forelse($employees as $employee)
    <div>{{ $employee->name }}</div>
@empty
    <p>従業員が登録されていません。</p>
@endforelse

@for($i = 1; $i <= 10; $i++)
    <span>{{ $i }}</span>
@endfor
ポイント

@forelse@foreachの拡張版で、配列が空だった場合の表示を@emptyブロックで指定できます。一覧表示の実装で非常に便利です。

レイアウトの継承

共通レイアウト(ヘッダー、フッター、サイドバーなど)を親テンプレートに定義し、各ページから継承できます。これにより、共通部分を1箇所で管理でき、保守性が大幅に向上します。

resources/views/layouts/app.blade.php
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>@yield('title', 'My App')</title>
    @yield('head')
</head>
<body>
    <header>共通ヘッダー</header>
    <main>
        @yield('content')
    </main>
    <footer>共通フッター</footer>
</body>
</html>
resources/views/home.blade.php
@extends('layouts.app')

@section('title', 'ホーム')

@section('content')
    <h1>ホームページ</h1>
    <p>ようこそ、{{ $user->name }}さん!</p>
@endsection

@extendsで親テンプレートを指定し、@sectionで親テンプレートの@yieldに対応するコンテンツを定義します。ドット記法(layouts.app)はディレクトリの区切りを表します。

部分テンプレートの読み込み

共通パーツ(ナビゲーション、モーダル、フォーム部品など)を別ファイルに切り出して、@includeで読み込むことができます。

blade.php
<!-- 基本の読み込み -->
@include('partials.header')

<!-- 変数を渡して読み込み -->
@include('partials.modal', ['title' => 'ログイン'])

<!-- 条件付き読み込み -->
@includeWhen($user->isAdmin(), 'partials.admin-panel')

<!-- ファイルが存在する場合のみ読み込み -->
@includeIf('partials.optional-section')
ポイント

@includeに渡した変数は、読み込み先のテンプレート内でそのまま使用できます。また、親テンプレートの変数もすべて引き継がれます。

まとめ

  • Bladeは.blade.php拡張子のテンプレートエンジンで、resources/views/に配置する
  • {{ }}で変数を安全に表示(自動エスケープ付き)
  • @if@foreach@forelseで条件分岐やループを記述する
  • @extends@sectionでレイアウトを継承し、共通部分を一元管理できる
  • @includeで部分テンプレートを読み込み、コードを再利用する