本文へ移動
Laravel Tips

Blade テンプレート

Laravel のテンプレートの書き方 Blade で、値の表示・条件分岐・くり返し・フォームの部品・スタックなどのディレクティブを使う方法をまとめます。

Blade(ブレード)は、Laravel に入っている、画面の見た目を書くためのテンプレートの書き方です。HTML の中に、変数の表示や「もし〜なら」「〜をくり返す」といった命令を、かんたんな形で書きこめます。ふつうの PHP もそのまま書けます。Blade のファイルは、最初に PHP のコードへ変換されて取っておかれるので、速さもほとんど落ちません。

ファイルの名前は .blade.php で終わり、たいてい resources/views に置きます。ルート(URL と、それを受け持つ処理を結びつけること)やコントローラーからは、view ヘルパー関数(どこからでも呼べる便利な関数)で返します。2つ目の引数に配列を渡すと、ビューの中でその値が使えます。

php
Route::get('/', function () {
    return view('greeting', ['name' => 'Finn']);
});

補足

画面をもっと動的にしたいときは、Laravel Livewire というパッケージがあります。React や Vue のような JavaScript のしくみを使わずに、動きのある Blade の部品を作れます。

値を表示する#

変数は、二重の波かっこ {{ }} で囲むと表示できます。

php
Route::get('/', function () {
    return view('welcome', ['name' => 'Samantha']);
});
blade
Hello, {{ $name }}.

{{ }} の中には、変数だけでなく、PHP の関数の結果など、好きな PHP のコードを書けます。

blade
The current UNIX timestamp is {{ time() }}.

補足

{{ }} で表示した値は、自動で PHP の htmlspecialchars 関数を通ります。< などの記号を安全な文字に置きかえて、XSS(ほかの人が悪意のあるスクリプトを、ページに混ぜこむ攻撃)を防ぐためです。

HTML の記号の置きかえ#

ふつう、Blade と e 関数は、すでに置きかえられた記号(&amp; など)も、もう一度置きかえます(二重エンコード)。これを止めたいときは、AppServiceProvider(アプリの起動のときに設定を書く場所)の boot メソッドで、Blade::withoutDoubleEncoding を呼びます。

php
<?php

namespace App\Providers;

use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        Blade::withoutDoubleEncoding();
    }
}

置きかえずにそのまま表示する#

記号を置きかえたくないときは、{!! !!} を使います。

blade
Hello, {!! $name !!}.

注意

ユーザーが入力した内容を {!! !!} で表示するのは、とても危険です。ユーザーの入力には、ふつう置きかえてくれる {{ }} を使ってください。

JavaScript のフレームワークと一緒に使う#

Vue などの JavaScript のフレームワークも、値の表示に波かっこを使います。Blade に触らせたくない波かっこの前には、@ を付けます。

blade
<h1>Laravel</h1>

Hello, @{{ name }}.

この例では、@ だけが消え、{{ name }} はそのまま HTML に出ます。あとは JavaScript 側が表示してくれます。

@ は、Blade のディレクティブ(@if のように @ で始まる命令)を、そのままの文字として出したいときにも使えます。

blade
{{-- Blade template --}}
@@if()

<!-- HTML output -->
@if()

JSON として表示する#

配列を JSON(データを文字で表す形式)にして、JavaScript の変数に入れたいことがあります。json_encode を自分で呼ぶ書き方は、次のとおりです。

blade
<script>
    var app = <?php echo json_encode($array); ?>;
</script>

代わりに Illuminate\Support\Js::from メソッドを使うと、HTML の中に入れても安全な形に直してくれます。引数は json_encode と同じです。結果は、配列やオブジェクトを JavaScript のオブジェクトに変える JSON.parse の文になります。

blade
<script>
    var app = {{ Illuminate\Support\Js::from($array) }};
</script>

新しい Laravel のアプリには Js ファサード(Route::get() のように、クラス名と :: で機能を呼べる窓口)が入っていて、短く書けます。

blade
<script>
    var app = {{ Js::from($array) }};
</script>

注意

Js::from は、すでにある変数を JSON にするためだけに使ってください。Blade は正規表現(文字の並びを探すしくみ)で動いているので、複雑な式を渡すと、うまく動かないことがあります。

@verbatim#

テンプレートの広い範囲で JavaScript の変数を表示するなら、@verbatim で囲むと、波かっこごとに @ を付けなくて済みます。

blade
@verbatim
    <div class="container">
        Hello, {{ name }}.
    </div>
@endverbatim

ディレクティブ#

Blade には、条件分岐やくり返しなどの PHP の構文を、短く書けるディレクティブがあります。書き方はふつうの PHP とそっくりです。

if 文#

@if・@elseif・@else・@endif で、if 文を作れます。

blade
@if (count($records) === 1)
    I have one record!
@elseif (count($records) > 1)
    I have multiple records!
@else
    I don't have any records!
@endif

@unless は「〜でないなら」です。

blade
@unless (Auth::check())
    You are not signed in.
@endunless

@isset と @empty は、PHP の同じ名前の関数の近道です。

blade
@isset($records)
    // $records is defined and is not null...
@endisset

@empty($records)
    // $records is "empty"...
@endempty

ログインに関するディレクティブ#

@auth と @guest で、ログインしている人か、していない人(ゲスト)かで分けられます。

blade
@auth
    // The user is authenticated...
@endauth

@guest
    // The user is not authenticated...
@endguest

調べるガード(ログインの確かめ方の種類)を指定することもできます。

blade
@auth('admin')
    // The user is authenticated...
@endauth

@guest('admin')
    // The user is not authenticated...
@endguest

環境に関するディレクティブ#

@production は、本番の環境で動いているときだけ中身を出します。

blade
@production
    // Production specific content...
@endproduction

@env で、名前を指定した環境かどうかを調べられます。配列で複数の環境も指定できます。

blade
@env('staging')
    // The application is running in "staging"...
@endenv

@env(['staging', 'production'])
    // The application is running in "staging" or "production"...
@endenv

セクションに関するディレクティブ#

@hasSection は、テンプレートの継承(レイアウトの作り方)のセクションに中身があるかを調べます。sectionMissing は、中身が無いかを調べます。

blade
@hasSection('navigation')
    <div class="pull-right">
        @yield('navigation')
    </div>

    <div class="clearfix"></div>
@endif
blade
@sectionMissing('navigation')
    <div class="pull-right">
        @include('default-navigation')
    </div>
@endif

セッションに関するディレクティブ#

@session は、セッションに、その名前の値があるときだけ中身を出します。中では $value でその値を表示できます。

blade
@session('status')
    <div class="p-4 bg-green-100">
        {{ $value }}
    </div>
@endsession

コンテキストに関するディレクティブ#

@context は、コンテキストにその名前の値があるときだけ中身を出します。中では $value が使えます。

blade
@context('canonical')
    <link href="{{ $value }}" rel="canonical">
@endcontext

switch 文#

@switch・@case・@break・@default・@endswitch で、switch 文を作れます。

blade
@switch($i)
    @case(1)
        First case...
        @break

    @case(2)
        Second case...
        @break

    @default
        Default case...
@endswitch

くり返し#

くり返しのディレクティブも、PHP と同じ動きをします。

blade
@for ($i = 0; $i < 10; $i++)
    The current value is {{ $i }}
@endfor

@foreach ($users as $user)
    <p>This is user {{ $user->id }}</p>
@endforeach

@forelse ($users as $user)
    <li>{{ $user->name }}</li>
@empty
    <p>No users</p>
@endforelse

@while (true)
    <p>I'm looping forever.</p>
@endwhile

@forelse は、くり返す中身が空のときに @empty の部分を出します。

補足

foreach の中では、$loop 変数で「最初の1回か」「最後の1回か」などが分かります。くわしくは次の節です。

@continue で今回の分を飛ばし、@break でくり返しを終えられます。

blade
@foreach ($users as $user)
    @if ($user->type == 1)
        @continue
    @endif

    <li>{{ $user->name }}</li>

    @if ($user->number == 5)
        @break
    @endif
@endforeach

条件を、ディレクティブの中に書くこともできます。

blade
@foreach ($users as $user)
    @continue($user->type == 1)

    <li>{{ $user->name }}</li>

    @break($user->number == 5)
@endforeach

$loop 変数#

foreach の中では、$loop という変数が使えます。いま何回目か、最初か最後か、などが分かります。

blade
@foreach ($users as $user)
    @if ($loop->first)
        This is the first iteration.
    @endif

    @if ($loop->last)
        This is the last iteration.
    @endif

    <p>This is user {{ $user->id }}</p>
@endforeach

くり返しの中にくり返しがあるとき(入れ子)は、parent で外側の $loop を使えます。

blade
@foreach ($users as $user)
    @foreach ($user->posts as $post)
        @if ($loop->parent->first)
            This is the first iteration of the parent loop.
        @endif
    @endforeach
@endforeach

$loop には、次の値があります。

名前 説明
$loop->index いまが何番目か(0 から数える)
$loop->iteration いまが何回目か(1 から数える)
$loop->remaining あと何回残っているか
$loop->count くり返す配列の全部の数
$loop->first 最初の1回かどうか
$loop->last 最後の1回かどうか
$loop->even 偶数回目かどうか
$loop->odd 奇数回目かどうか
$loop->depth くり返しの入れ子の深さ
$loop->parent 入れ子のとき、外側の $loop

条件つきのクラスとスタイル#

@class は、条件に合うときだけ CSS のクラス(見た目をまとめた名前)を付けます。配列のキーに付けたいクラス、値に条件を書きます。キーが数字の要素は、いつでも付きます。

blade
@php
    $isActive = false;
    $hasError = true;
@endphp

<span @class([
    'p-4',
    'font-bold' => $isActive,
    'text-gray-500' => ! $isActive,
    'bg-red' => $hasError,
])></span>

<span class="p-4 text-gray-500 bg-red"></span>

@style も同じように、条件に合うときだけ CSS を付けます。付くのは、その部品の style 属性に直接書く CSS(インラインの CSS)です。

blade
@php
    $isActive = true;
@endphp

<span @style([
    'background-color: red',
    'font-weight: bold' => $isActive,
])></span>

<span style="background-color: red; font-weight: bold;"></span>

条件で付く属性#

フォームの部品に、条件しだいで付ける属性(HTML の部品に添える設定)のためのディレクティブがあります。条件が true のときだけ、その属性が出ます。

ディレクティブ 説明
@checked チェックボックスなどに checked(チェックずみ)を付ける
@selected 選ぶ欄の項目に selected(選択ずみ)を付ける
@disabled 部品に disabled(押せない状態)を付ける
@readonly 部品に readonly(読むだけ)を付ける
@required 部品に required(必須)を付ける
blade
<input
    type="checkbox"
    name="active"
    value="active"
    @checked(old('active', $user->active))
/>
blade
<select name="version">
    @foreach ($product->versions as $version)
        <option value="{{ $version }}" @selected(old('version') == $version)>
            {{ $version }}
        </option>
    @endforeach
</select>
blade
<button type="submit" @disabled($errors->isNotEmpty())>Submit</button>
blade
<input
    type="email"
    name="email"
    value="email@laravel.com"
    @readonly($user->isNotAdmin())
/>
blade
<input
    type="text"
    name="title"
    value="title"
    @required($user->isAdmin())
/>

別のビューを組みこむ#

補足

@include は使えますが、コンポーネント(何度も使う画面の部品)のほうが、データや属性を渡せるなど、便利な点が多くあります。

@include は、別の Blade のビューを、いまのビューの中に組みこみます。親のビューで使える変数は、組みこんだ先でも使えます。

blade
<div>
    @include('shared.errors')

    <form>
        <!-- Form Contents -->
    </form>
</div>

追加のデータを、配列で渡すこともできます。

blade
@include('view.name', ['status' => 'complete'])

組みこむビューが無いと、エラーになります。あるかどうか分からないときは @includeIf を使います。

blade
@includeIf('view.name', ['status' => 'complete'])

条件で決めたいときは、@includeWhen(true のとき)と @includeUnless(false のとき)です。

blade
@includeWhen($boolean, 'view.name', ['status' => 'complete'])

@includeUnless($boolean, 'view.name', ['status' => 'complete'])

配列の中で、最初に見つかったビューを組みこむには @includeFirst です。

blade
@includeFirst(['custom.admin', 'admin'], ['status' => 'complete'])

親の変数を引きつがずに組みこみたいときは @includeIsolated です。渡した変数だけが使えます。

blade
@includeIsolated('view.name', ['user' => $user])

組みこみのディレクティブをまとめると、次のとおりです。

ディレクティブ 説明
@include ビューを組みこむ(無いとエラー)
@includeIf ビューがあれば組みこむ
@includeWhen 条件が true のとき組みこむ
@includeUnless 条件が false のとき組みこむ
@includeFirst 配列の中で最初にあるビューを組みこむ
@includeIsolated 親の変数を引きつがずに組みこむ
@each 配列の1つずつに、ビューを組みこむ

注意

Blade のビューの中で、__DIR__ と __FILE__ は使わないでください。取っておかれた変換後のファイルの場所を指してしまいます。

配列の要素ごとにビューを組みこむ#

@each は、くり返しと組みこみを1行で書けます。

blade
@each('view.name', $jobs, 'job')

1つ目の引数は組みこむビュー、2つ目はくり返す配列(コレクション)、3つ目はビューの中で1つ分を受ける変数の名前です。配列のキーは、ビューの中で key という変数に入ります。

4つ目の引数に、配列が空のときに出すビューを指定できます。

blade
@each('view.name', $jobs, 'job', 'view.empty')

注意

@each で出したビューは、親の変数を引きつぎません。親の変数が要るなら、@foreach と @include を使ってください。

@once#

@once で囲んだ部分は、1回の表示のあいだに、1度だけ出ます。コンポーネントをくり返しの中で出すときに、JavaScript を1度だけ「スタック」(下の節)へ入れたい、といったときに便利です。

blade
@once
    @push('scripts')
        <script>
            // Your custom JavaScript...
        </script>
    @endpush
@endonce

@once は @push や @prepend といっしょに使うことが多いので、@pushOnce と @prependOnce もあります。

blade
@pushOnce('scripts')
    <script>
        // Your custom JavaScript...
    </script>
@endPushOnce

別々の2つの Blade ファイルから同じ内容を入れるときは、@pushOnce の2つ目の引数に、同じ見分けの名前を付けます。そうすると1度だけ出ます。

blade
<!-- pie-chart.blade.php -->
@pushOnce('scripts', 'chart.js')
    <script src="/chart.js"></script>
@endPushOnce

<!-- line-chart.blade.php -->
@pushOnce('scripts', 'chart.js')
    <script src="/chart.js"></script>
@endPushOnce

生の PHP#

ビューの中に PHP のコードを書きたいときは、@php を使います。

blade
@php
    $counter = 1;
@endphp

クラスを読みこむ(use する)だけなら @use が使えます。

blade
@use('App\Models\Flight')

2つ目の引数で、別名を付けられます。

blade
@use('App\Models\Flight', 'FlightModel')

同じ名前空間(クラスをしまう場所の名前)のクラスは、まとめて書けます。

blade
@use('App\Models\{Flight, Airport}')

function や const を前に付けると、関数や定数も読みこめます。

blade
@use(function App\Helpers\format_currency)
@use(const App\Constants\MAX_ATTEMPTS)

関数や定数にも別名を付けられます。

blade
@use(function App\Helpers\format_currency, 'formatMoney')
@use(const App\Constants\MAX_ATTEMPTS, 'MAX_TRIES')

まとめ書きも、function と const の両方でできます。

blade
@use(function App\Helpers\{format_currency, format_date})
@use(const App\Constants\{MAX_ATTEMPTS, DEFAULT_TIMEOUT})

フォント#

Vite でフォントを読みこむ設定をしているときは、@fonts を使います。フォントを前もって読みこませるリンク(先読み)と、フォントの CSS を出してくれます。レイアウトの <head> の中に置きます。

blade
<!doctype html>
<head>
    {{-- ... --}}

    @fonts
    @vite('resources/js/app.js')
</head>

@fonts は、vite.config.js に設定したフォントを、全部出します。そのフォントを使う内容より前に置くのがふつうです。

ページで一部のフォントだけ要るときは、フォントの別名(alias)を渡せます。

blade
{{-- Load a single font alias... --}}
@fonts('sans')

{{-- Load multiple font aliases... --}}
@fonts(['sans', 'mono'])

別名は、Vite の設定でフォントを決めるときの alias オプションで付けます。@fonts は Vite ファサードの fonts メソッドを呼んでいるので、直接呼ぶこともできます。

blade
{{ Vite::fonts(['sans', 'mono']) }}

コメント#

Blade のコメントは、HTML のコメントとちがい、出力される HTML に入りません。

blade
{{-- This comment will not be present in the rendered HTML --}}

ディレクティブの早見表#

この節に出てきたディレクティブを、まとめて並べます。

ディレクティブ 説明
@if / @elseif / @else / @endif 条件で分ける
@unless 条件が false のとき出す
@isset 変数があり、null でないとき出す
@empty 変数が空のとき出す
@auth / @guest ログイン中/ゲストのとき出す
@production 本番の環境のとき出す
@env 指定した環境のとき出す
@hasSection セクションに中身があるとき出す
@sectionMissing セクションに中身が無いとき出す
@session セッションに値があるとき出す
@context コンテキストに値があるとき出す
@switch / @case / @break / @default switch 文を作る
@for / @foreach / @forelse / @while くり返す
@continue / @break くり返しの今回を飛ばす/終える
@class / @style 条件つきのクラス/スタイル
@checked / @selected / @disabled / @readonly / @required 条件つきの属性
@once / @pushOnce / @prependOnce 1度だけ出す
@php / @use 生の PHP/クラスなどの読みこみ
@fonts フォントの先読みと CSS を出す
@verbatim Blade に触らせず、そのまま出す
@csrf CSRF の隠し入力欄を作る
@method PUT などのふりをする隠し入力欄を作る
@error その入力欄にエラーがあるとき出す
@inject サービスコンテナから道具を取り出す
@fragment テンプレートの一部分に名前を付ける(@endfragment で閉じる)

フォームのためのディレクティブ#

CSRF の隠し入力欄#

フォームには、CSRF の合言葉の隠し入力欄が要ります。@csrf で作れます。くわしくは CSRF 対策のページです。

blade
<form method="POST" action="/profile">
    @csrf

    ...
</form>

メソッドの隠し入力欄#

HTML のフォームは PUT・PATCH・DELETE で送れません。そこで、_method という隠し入力欄で、そのふりをします。@method で作れます。

blade
<form action="/foo/bar" method="POST">
    @method('PUT')

    ...
</form>

入力のエラー#

@error は、その入力欄にバリデーション(入力のチェック)のエラーがあるかを調べます。中では $message で、エラーの文を表示できます。

blade
<!-- /resources/views/post/create.blade.php -->

<label for="title">Post Title</label>

<input
    id="title"
    type="text"
    class="@error('title') is-invalid @enderror"
/>

@error('title')
    <div class="alert alert-danger">{{ $message }}</div>
@enderror

@error は if 文に変わるので、エラーが無いときのために @else も使えます。

blade
<!-- /resources/views/auth.blade.php -->

<label for="email">Email address</label>

<input
    id="email"
    type="email"
    class="@error('email') is-invalid @else is-valid @enderror"
/>

1つのページにフォームが複数あるときは、2つ目の引数に、エラーのまとまり(エラーバッグ)の名前を渡せます。

blade
<!-- /resources/views/auth.blade.php -->

<label for="email">Email address</label>

<input
    id="email"
    type="email"
    class="@error('email', 'login') is-invalid @enderror"
/>

@error('email', 'login')
    <div class="alert alert-danger">{{ $message }}</div>
@enderror

スタック#

Blade では、名前を付けた「スタック」に中身を積んでおき、別のビューやレイアウトで、まとめて出せます。子のビューが要る JavaScript のファイルを、レイアウトの <head> へ出したいときに便利です。

blade
@push('scripts')
    <script src="/example.js"></script>
@endpush

@pushIf は、条件が true のときだけ積みます。

blade
@pushIf($shouldPush, 'scripts')
    <script src="/example.js"></script>
@endPushIf

何度でも積めます。積んだ中身を全部出すには、@stack にスタックの名前を渡します。

blade
<head>
    <!-- Head Contents -->

    @stack('scripts')
</head>

先頭に積みたいときは @prepend です。

blade
@push('scripts')
    This will be second...
@endpush

// Later...

@prepend('scripts')
    This will be first...
@endprepend

@hasstack で、スタックが空かどうかを調べられます。

blade
@hasstack('list')
    <ul>
        @stack('list')
    </ul>
@endif
ディレクティブ 説明
@push スタックの後ろに積む
@pushIf 条件が true のとき、後ろに積む
@prepend スタックの先頭に積む
@stack 積んだ中身を全部出す
@hasstack スタックに中身があるか調べる

サービスの注入#

@inject は、サービスコンテナ(クラスを作って渡してくれる、道具箱のようなしくみ)から、道具(サービス)を取り出します。1つ目の引数は、入れる変数の名前、2つ目はクラスかインターフェース(クラスが持つべきメソッドの決まり)の名前です。

blade
@inject('metrics', 'App\Services\MetricsService')

<div>
    Monthly Revenue: {{ $metrics->monthlyRevenue() }}.
</div>

文字列から Blade を表示する#

Blade の書き方で書いた文字列を、HTML にしたいときは、Blade ファサードの render メソッドを使います。2つ目の引数に、テンプレートへ渡すデータの配列を付けられます。

php
use Illuminate\Support\Facades\Blade;

return Blade::render('Hello, {{ $name }}', ['name' => 'Julian Bashir']);

この方法では、一時的なファイルを storage/framework/views に書き出します。表示したあとに消したいときは、deleteCachedView 引数を付けます。

php
return Blade::render(
    'Hello, {{ $name }}',
    ['name' => 'Julian Bashir'],
    deleteCachedView: true
);

Blade の一部だけを返す(フラグメント)#

Turbo や htmx(ページ全体を読みなおさずに、一部だけを書きかえるしくみ)を使うとき、Blade のテンプレートの一部分だけを返したいことがあります。それが「フラグメント」です。返したい部分を @fragment と @endfragment で囲みます。

blade
@fragment('user-list')
    <ul>
        @foreach ($users as $user)
            <li>{{ $user->name }}</li>
        @endforeach
    </ul>
@endfragment

ビューを返すとき、fragment メソッドで、その部分だけを返すように指定します。

php
return view('dashboard', ['users' => $users])->fragment('user-list');

fragmentIf は、条件が合うときだけフラグメントを返し、合わないときはビュー全体を返します。

php
return view('dashboard', ['users' => $users])
    ->fragmentIf($request->hasHeader('HX-Request'), 'user-list');

fragments と fragmentsIf は、複数のフラグメントを返します。つなげて返されます。

php
view('dashboard', ['users' => $users])
    ->fragments(['user-list', 'comment-list']);

view('dashboard', ['users' => $users])
    ->fragmentsIf(
        $request->hasHeader('HX-Request'),
        ['user-list', 'comment-list']
    );
メソッド 説明
fragment 指定した1つのフラグメントだけを返す
fragmentIf 条件が合うときだけフラグメントを返す(合わなければ全体)
fragments 複数のフラグメントをつなげて返す
fragmentsIf 条件が合うときだけ、複数のフラグメントを返す

Blade を拡張する#

自分だけのディレクティブは、directive メソッドで作れます。Blade は、そのディレクティブを見つけると、中に書かれた式を引数にして、渡した関数を呼びます。

次の例は、DateTime の値を整えて表示する @datetime($var) を作ります。

php
<?php

namespace App\Providers;

use Illuminate\Support\Facades\Blade;
use Illuminate\Support\ServiceProvider;

class AppServiceProvider extends ServiceProvider
{
    /**
     * Register any application services.
     */
    public function register(): void
    {
        // ...
    }

    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        Blade::directive('datetime', function (string $expression) {
            return "<?php echo ($expression)->format('m/d/Y H:i'); ?>";
        });
    }
}

渡された式に format をつなげているので、このディレクティブが作る PHP は、次のようになります。

php
<?php echo ($var)->format('m/d/Y H:i'); ?>

注意

ディレクティブの中身を直したら、取っておかれた Blade のビューを全部消す必要があります。view:clear という Artisan コマンド(php artisan で動かすコマンド)で消せます。

自分のクラスの表示のしかた#

Blade でオブジェクトを表示すると、そのオブジェクトの __toString メソッド(PHP が文字にするときに呼ぶ決まったメソッド)が呼ばれます。ただし、外部のライブラリのクラスなどは、自分で __toString を直せません。

そんなときは、Blade の stringable メソッドで、そのクラスの表示のしかたを登録できます。関数の引数には、表示のしかたを決めたいクラスを、型として書きます。ふつうは AppServiceProvider の boot メソッドで呼びます。

php
use Illuminate\Support\Facades\Blade;
use Money\Money;

/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Blade::stringable(function (Money $money) {
        return $money->formatTo('en_GB');
    });
}

登録したあとは、テンプレートでそのまま表示できます。

blade
Cost: {{ $money }}

自分の if 文#

単純な条件のためには、ディレクティブを作るのは大げさです。Blade::if を使うと、関数で、条件のディレクティブをかんたんに作れます。次の例は、使っているディスク(ファイルの保存先)の設定を調べます。

php
use Illuminate\Support\Facades\Blade;

/**
 * Bootstrap any application services.
 */
public function boot(): void
{
    Blade::if('disk', function (string $value) {
        return config('filesystems.default') === $value;
    });
}

作ったあとは、テンプレートで使えます。

blade
@disk('local')
    <!-- The application is using the local disk... -->
@elsedisk('s3')
    <!-- The application is using the s3 disk... -->
@else
    <!-- The application is using some other disk... -->
@enddisk

@unlessdisk('local')
    <!-- The application is not using the local disk... -->
@enddisk

コンポーネントとレイアウト#

画面の部品(コンポーネント)、名前を付けない部品、レイアウトの作り方は、Blade コンポーネントとレイアウトのページにあります。

関連するページ#

公式ドキュメント(英語)

2026年10月5日時点の内容をもとに、日本語でまとめています。

ページの一覧