本記事では、LaravelのビューテンプレートエンジンであるBladeにおける変数の取り扱い方や、知っておくと便利な活用テクニックをご紹介します。
BladeはPHPのフレームワークLaravelで標準的に用いられるテンプレートエンジンであり、ビューの分離とコードの見通しをよくすることができます。
ここでは、基本的な変数の書き方から、スコープ、Helper関数との組み合わせまで、実務で役立つポイントを丁寧に解説します。
Bladeでの変数の基本的な書き方
Bladeテンプレートでは、{{ }}
を使ってPHPの変数を簡潔に表示できます。
例えば以下のようなコードで、コントローラーから渡された$user
変数のname
プロパティを表示することができます。
<p>{{ $user->name }}</p>
このように、PHPのecho
文を書くよりも遥かにすっきりと、テンプレート上に変数を埋め込むことが可能です。
また、Bladeは自動的にエスケープ処理を行うため、HTMLの特殊文字や潜在的なXSS攻撃への対策も簡潔に行えます。
エスケープ処理について
{{ $variable }}
で出力する場合、Laravelはhtmlspecialchars()
関数を用いて値を自動的にエスケープします。
もし、エスケープを行わずに生のHTMLを出力したい場合は、{!! $variable !!}
という表記を利用します。
例えば、DBから取得した値をHTMLとして表示したい場合などに便利ですが、XSSの危険性があるため十分注意して使用する必要があります。
変数のスコープとビュー間のデータ受け渡し
Bladeで変数を使用するためには、基本的にコントローラーからビューにデータを渡す必要があります。
通常、コントローラー内で以下のようにview()
ヘルパーを使ってデータを渡します。
return view('profile', ['user' => $user]);
ここで定義した'user' => $user
が、Bladeテンプレート内で$user
として参照できます。
コントローラー側での変数名とBladeで表示する際の変数名は一致させることが一般的ですが、配列のキー名でBlade側の変数名が決まるため、自由に変更も可能です。
ビューロジック分割と@include
、@component
Bladeでは一つの大きなテンプレートの中で完結するのではなく、@include
ディレクティブを用いて小さなテンプレートを呼び出すことができます。
この際、@include('partial', ['data' => $value])
と記述すれば、partial.blade.php
の中で$data
変数が使えるようになります。
また、@component
ディレクティブでも同様にコンポーネント用のテンプレートへ変数を渡せます。
こうした分割やコンポーネント化により、コードの再利用性が高まり、可読性を向上させることができます。
Blade内での条件分岐やループと変数
Bladeでは制御構文として@if
、@elseif
、@else
、@endif
や@foreach
、@for
、@while
といったディレクティブが用意されています。
これらの制御文内でコントローラーから渡された変数を用いて表示を制御することが可能です。
@if($user->isActive())
<p>{{ $user->name }}さんはアクティブなユーザーです。</p>
@endif
<ul>
@foreach($products as $product)
<li>{{ $product->title }}:{{ $product->price }}円</li>
@endforeach
</ul>
こういった制御構文と変数を組み合わせることで、柔軟かつ見やすいテンプレートを実現できます。
Helper関数とLaravelコレクションでの変数活用
Bladeでは、Laravelの多数のHelper関数やコレクションメソッドを積極的に用いることができます。
例えば、@dd()
やdump()
で変数の中身をデバッグ可能です。
また、コントローラーでEloquentコレクションを用いてデータを取得した場合、$products->map()
や$users->filter()
といったメソッドで取得データを自在に加工できます。
Blade内で直接コレクション操作を行うことは極力避けるべきですが、ビジネスロジックが軽微な場合、軽めのフィルタリング程度であればBlade内で行うこともあります。
ただし、MVCの責務分離を保ちたい場合、基本的にはコントローラーやサービス層で行ったデータ処理結果をBladeへ渡す構造にするほうが望ましいです。
文字列操作や日付フォーマット
Bladeでの変数出力時に、簡易な文字列操作や日付フォーマットを行いたい場合、Laravelが提供するStr
やCarbon
などのクラスを使うこともあります。
例えば、日付オブジェクトである$user->created_at
をformat()
メソッドで整形して出力することができます。
<p>登録日: {{ $user->created_at->format('Y-m-d') }}</p>
こういったシンプルな処理はBlade内に直接書くことも珍しくありませんが、あまり複雑になる場合はヘルパー関数を作成する、またはアクセス子などでデータを整形することを検討するとよいでしょう。
Bladeコンポーネントと変数のバインド
近年のLaravelではBladeコンポーネントが強化され、再利用性と可読性がさらに向上しています。
Bladeコンポーネントに変数を渡すには、以下のようにコンポーネント呼び出し時にプロパティを割り当てます。
<x-alert type="success" :message="$successMessage" />
コンポーネント側では、public $message;
のようにプロパティを定義しておくと、Blade内でその値を{{ $message }}
で使用できます。
これはView Composerや@inject
ディレクティブなどを用いた従来の方法よりも簡潔でわかりやすく、変数管理がしやすくなります。
テスト時におけるBladeテンプレート変数の確認
Bladeでの開発が進むと、テンプレート上の変数が正しく受け渡されているか、テストを行いたくなることがあります。
Laravelでは、HTTPテスト機能を用いてビューテンプレートで生成されたHTMLをアサーションすることができます。
例えば、以下のようにテストコードで、特定のテキストが表示されているか確認できます。
public function testProfilePageDisplaysUserName()
{
$user = User::factory()->create(['name' => 'テストユーザー']);
$this->get('/profile')
->assertSee('テストユーザー');
}
このようなテストを書くことで、Bladeテンプレート内での変数受け渡しが正しく行われているかを担保できます。
まとめ
本記事では、LaravelのBladeテンプレートにおける変数の基本的な使い方からエスケープ処理、生HTMLの扱い、そしてビュー間の変数受け渡しの方法やコンポーネントへのバインドなど、幅広く解説しました。
Bladeを使いこなすことで、コードの可読性、保守性が向上し、開発速度も上げることができます。
テンプレート内では基本的なロジックにとどめ、複雑な処理はコントローラーやサービス層に任せる、コンポーネントを活用して責務を分割する、といったアーキテクチャ的な考え方も品質の向上には欠かせません。
これらのポイントを押さえれば、Laravel Bladeでの変数利用はより直感的で安全なものとなり、効率的な開発へとつなげられます。