Bladeは、Laravelに標準搭載されたテンプレートエンジンです。PHPの制御構文をシンプルなディレクティブ(@if、@foreach等)で記述でき、レイアウトの継承や部分テンプレートの読み込みも簡単に行えます。この記事では、Bladeの基本構文からレイアウト継承まで、実践的な使い方を解説します。
Bladeテンプレートとは
Bladeテンプレートは、拡張子が.blade.phpのファイルで、resources/views/ディレクトリに配置します。通常のPHPとHTMLをそのまま書くこともできますが、Blade独自のディレクティブを使うことで、より簡潔で読みやすいコードを書くことができます。
コントローラーから渡された変数をビューに表示したり、条件分岐やループ処理を行ったりする際に、Bladeのディレクティブが活躍します。
Bladeテンプレートは最終的にPHPコードにコンパイルされてキャッシュされるため、パフォーマンスへの影響はほとんどありません。
変数の表示
コントローラーから渡された変数を表示するには、二重波括弧{{ }}を使います。この記法はHTMLエンティティを自動的にエスケープするため、XSS攻撃を防ぐことができます。
<!-- エスケープ付き表示(推奨) -->
{{ $variable }}
<!-- エスケープなし表示(HTML出力時) -->
{!! $htmlContent !!}
<!-- デフォルト値の設定 -->
{{ $name ?? 'ゲスト' }}
{!! !!}はHTMLをそのまま出力するため、ユーザー入力を表示する場合は必ず{{ }}を使用してください。XSS脆弱性の原因になります。
条件分岐
Bladeでは@ifディレクティブを使って条件分岐を記述します。PHPのif文と同じロジックですが、より簡潔に書くことができます。
@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ディレクティブを使います。
@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箇所で管理でき、保守性が大幅に向上します。
<!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>
@extends('layouts.app')
@section('title', 'ホーム')
@section('content')
<h1>ホームページ</h1>
<p>ようこそ、{{ $user->name }}さん!</p>
@endsection
@extendsで親テンプレートを指定し、@sectionで親テンプレートの@yieldに対応するコンテンツを定義します。ドット記法(layouts.app)はディレクトリの区切りを表します。
部分テンプレートの読み込み
共通パーツ(ナビゲーション、モーダル、フォーム部品など)を別ファイルに切り出して、@includeで読み込むことができます。
<!-- 基本の読み込み -->
@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で部分テンプレートを読み込み、コードを再利用する