Blade テンプレート
Laravel のテンプレートの書き方 Blade で、値の表示・条件分岐・くり返し・フォームの部品・スタックなどのディレクティブを使う方法をまとめます。
Blade(ブレード)は、Laravel に入っている、画面の見た目を書くためのテンプレートの書き方です。HTML の中に、変数の表示や「もし〜なら」「〜をくり返す」といった命令を、かんたんな形で書きこめます。ふつうの PHP もそのまま書けます。Blade のファイルは、最初に PHP のコードへ変換されて取っておかれるので、速さもほとんど落ちません。
ファイルの名前は .blade.php で終わり、たいてい resources/views に置きます。ルート(URL と、それを受け持つ処理を結びつけること)やコントローラーからは、view ヘルパー関数(どこからでも呼べる便利な関数)で返します。2つ目の引数に配列を渡すと、ビューの中でその値が使えます。
Route::get('/', function () {
return view('greeting', ['name' => 'Finn']);
});
補足
画面をもっと動的にしたいときは、Laravel Livewire というパッケージがあります。React や Vue のような JavaScript のしくみを使わずに、動きのある Blade の部品を作れます。
値を表示する#
変数は、二重の波かっこ {{ }} で囲むと表示できます。
Route::get('/', function () {
return view('welcome', ['name' => 'Samantha']);
});
Hello, {{ $name }}.
{{ }} の中には、変数だけでなく、PHP の関数の結果など、好きな PHP のコードを書けます。
The current UNIX timestamp is {{ time() }}.
補足
{{ }} で表示した値は、自動で PHP の htmlspecialchars 関数を通ります。< などの記号を安全な文字に置きかえて、XSS(ほかの人が悪意のあるスクリプトを、ページに混ぜこむ攻撃)を防ぐためです。
HTML の記号の置きかえ#
ふつう、Blade と e 関数は、すでに置きかえられた記号(& など)も、もう一度置きかえます(二重エンコード)。これを止めたいときは、AppServiceProvider(アプリの起動のときに設定を書く場所)の boot メソッドで、Blade::withoutDoubleEncoding を呼びます。
<?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();
}
}
置きかえずにそのまま表示する#
記号を置きかえたくないときは、{!! !!} を使います。
Hello, {!! $name !!}.
注意
ユーザーが入力した内容を {!! !!} で表示するのは、とても危険です。ユーザーの入力には、ふつう置きかえてくれる {{ }} を使ってください。
JavaScript のフレームワークと一緒に使う#
Vue などの JavaScript のフレームワークも、値の表示に波かっこを使います。Blade に触らせたくない波かっこの前には、@ を付けます。
<h1>Laravel</h1>
Hello, @{{ name }}.
この例では、@ だけが消え、{{ name }} はそのまま HTML に出ます。あとは JavaScript 側が表示してくれます。
@ は、Blade のディレクティブ(@if のように @ で始まる命令)を、そのままの文字として出したいときにも使えます。
{{-- Blade template --}}
@@if()
<!-- HTML output -->
@if()
JSON として表示する#
配列を JSON(データを文字で表す形式)にして、JavaScript の変数に入れたいことがあります。json_encode を自分で呼ぶ書き方は、次のとおりです。
<script>
var app = <?php echo json_encode($array); ?>;
</script>
代わりに Illuminate\Support\Js::from メソッドを使うと、HTML の中に入れても安全な形に直してくれます。引数は json_encode と同じです。結果は、配列やオブジェクトを JavaScript のオブジェクトに変える JSON.parse の文になります。
<script>
var app = {{ Illuminate\Support\Js::from($array) }};
</script>
新しい Laravel のアプリには Js ファサード(Route::get() のように、クラス名と :: で機能を呼べる窓口)が入っていて、短く書けます。
<script>
var app = {{ Js::from($array) }};
</script>
注意
Js::from は、すでにある変数を JSON にするためだけに使ってください。Blade は正規表現(文字の並びを探すしくみ)で動いているので、複雑な式を渡すと、うまく動かないことがあります。
@verbatim#
テンプレートの広い範囲で JavaScript の変数を表示するなら、@verbatim で囲むと、波かっこごとに @ を付けなくて済みます。
@verbatim
<div class="container">
Hello, {{ name }}.
</div>
@endverbatim
ディレクティブ#
Blade には、条件分岐やくり返しなどの PHP の構文を、短く書けるディレクティブがあります。書き方はふつうの PHP とそっくりです。
if 文#
@if・@elseif・@else・@endif で、if 文を作れます。
@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 は「〜でないなら」です。
@unless (Auth::check())
You are not signed in.
@endunless
@isset と @empty は、PHP の同じ名前の関数の近道です。
@isset($records)
// $records is defined and is not null...
@endisset
@empty($records)
// $records is "empty"...
@endempty
ログインに関するディレクティブ#
@auth と @guest で、ログインしている人か、していない人(ゲスト)かで分けられます。
@auth
// The user is authenticated...
@endauth
@guest
// The user is not authenticated...
@endguest
調べるガード(ログインの確かめ方の種類)を指定することもできます。
@auth('admin')
// The user is authenticated...
@endauth
@guest('admin')
// The user is not authenticated...
@endguest
環境に関するディレクティブ#
@production は、本番の環境で動いているときだけ中身を出します。
@production
// Production specific content...
@endproduction
@env で、名前を指定した環境かどうかを調べられます。配列で複数の環境も指定できます。
@env('staging')
// The application is running in "staging"...
@endenv
@env(['staging', 'production'])
// The application is running in "staging" or "production"...
@endenv
セクションに関するディレクティブ#
@hasSection は、テンプレートの継承(レイアウトの作り方)のセクションに中身があるかを調べます。sectionMissing は、中身が無いかを調べます。
@hasSection('navigation')
<div class="pull-right">
@yield('navigation')
</div>
<div class="clearfix"></div>
@endif
@sectionMissing('navigation')
<div class="pull-right">
@include('default-navigation')
</div>
@endif
セッションに関するディレクティブ#
@session は、セッションに、その名前の値があるときだけ中身を出します。中では $value でその値を表示できます。
@session('status')
<div class="p-4 bg-green-100">
{{ $value }}
</div>
@endsession
コンテキストに関するディレクティブ#
@context は、コンテキストにその名前の値があるときだけ中身を出します。中では $value が使えます。
@context('canonical')
<link href="{{ $value }}" rel="canonical">
@endcontext
switch 文#
@switch・@case・@break・@default・@endswitch で、switch 文を作れます。
@switch($i)
@case(1)
First case...
@break
@case(2)
Second case...
@break
@default
Default case...
@endswitch
くり返し#
くり返しのディレクティブも、PHP と同じ動きをします。
@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 でくり返しを終えられます。
@foreach ($users as $user)
@if ($user->type == 1)
@continue
@endif
<li>{{ $user->name }}</li>
@if ($user->number == 5)
@break
@endif
@endforeach
条件を、ディレクティブの中に書くこともできます。
@foreach ($users as $user)
@continue($user->type == 1)
<li>{{ $user->name }}</li>
@break($user->number == 5)
@endforeach
$loop 変数#
foreach の中では、$loop という変数が使えます。いま何回目か、最初か最後か、などが分かります。
@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 を使えます。
@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 のクラス(見た目をまとめた名前)を付けます。配列のキーに付けたいクラス、値に条件を書きます。キーが数字の要素は、いつでも付きます。
@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)です。
@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(必須)を付ける |
<input
type="checkbox"
name="active"
value="active"
@checked(old('active', $user->active))
/>
<select name="version">
@foreach ($product->versions as $version)
<option value="{{ $version }}" @selected(old('version') == $version)>
{{ $version }}
</option>
@endforeach
</select>
<button type="submit" @disabled($errors->isNotEmpty())>Submit</button>
<input
type="email"
name="email"
value="email@laravel.com"
@readonly($user->isNotAdmin())
/>
<input
type="text"
name="title"
value="title"
@required($user->isAdmin())
/>
別のビューを組みこむ#
補足
@include は使えますが、コンポーネント(何度も使う画面の部品)のほうが、データや属性を渡せるなど、便利な点が多くあります。
@include は、別の Blade のビューを、いまのビューの中に組みこみます。親のビューで使える変数は、組みこんだ先でも使えます。
<div>
@include('shared.errors')
<form>
<!-- Form Contents -->
</form>
</div>
追加のデータを、配列で渡すこともできます。
@include('view.name', ['status' => 'complete'])
組みこむビューが無いと、エラーになります。あるかどうか分からないときは @includeIf を使います。
@includeIf('view.name', ['status' => 'complete'])
条件で決めたいときは、@includeWhen(true のとき)と @includeUnless(false のとき)です。
@includeWhen($boolean, 'view.name', ['status' => 'complete'])
@includeUnless($boolean, 'view.name', ['status' => 'complete'])
配列の中で、最初に見つかったビューを組みこむには @includeFirst です。
@includeFirst(['custom.admin', 'admin'], ['status' => 'complete'])
親の変数を引きつがずに組みこみたいときは @includeIsolated です。渡した変数だけが使えます。
@includeIsolated('view.name', ['user' => $user])
組みこみのディレクティブをまとめると、次のとおりです。
| ディレクティブ | 説明 |
|---|---|
@include |
ビューを組みこむ(無いとエラー) |
@includeIf |
ビューがあれば組みこむ |
@includeWhen |
条件が true のとき組みこむ |
@includeUnless |
条件が false のとき組みこむ |
@includeFirst |
配列の中で最初にあるビューを組みこむ |
@includeIsolated |
親の変数を引きつがずに組みこむ |
@each |
配列の1つずつに、ビューを組みこむ |
注意
Blade のビューの中で、__DIR__ と __FILE__ は使わないでください。取っておかれた変換後のファイルの場所を指してしまいます。
配列の要素ごとにビューを組みこむ#
@each は、くり返しと組みこみを1行で書けます。
@each('view.name', $jobs, 'job')
1つ目の引数は組みこむビュー、2つ目はくり返す配列(コレクション)、3つ目はビューの中で1つ分を受ける変数の名前です。配列のキーは、ビューの中で key という変数に入ります。
4つ目の引数に、配列が空のときに出すビューを指定できます。
@each('view.name', $jobs, 'job', 'view.empty')
注意
@each で出したビューは、親の変数を引きつぎません。親の変数が要るなら、@foreach と @include を使ってください。
@once#
@once で囲んだ部分は、1回の表示のあいだに、1度だけ出ます。コンポーネントをくり返しの中で出すときに、JavaScript を1度だけ「スタック」(下の節)へ入れたい、といったときに便利です。
@once
@push('scripts')
<script>
// Your custom JavaScript...
</script>
@endpush
@endonce
@once は @push や @prepend といっしょに使うことが多いので、@pushOnce と @prependOnce もあります。
@pushOnce('scripts')
<script>
// Your custom JavaScript...
</script>
@endPushOnce
別々の2つの Blade ファイルから同じ内容を入れるときは、@pushOnce の2つ目の引数に、同じ見分けの名前を付けます。そうすると1度だけ出ます。
<!-- 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 を使います。
@php
$counter = 1;
@endphp
クラスを読みこむ(use する)だけなら @use が使えます。
@use('App\Models\Flight')
2つ目の引数で、別名を付けられます。
@use('App\Models\Flight', 'FlightModel')
同じ名前空間(クラスをしまう場所の名前)のクラスは、まとめて書けます。
@use('App\Models\{Flight, Airport}')
function や const を前に付けると、関数や定数も読みこめます。
@use(function App\Helpers\format_currency)
@use(const App\Constants\MAX_ATTEMPTS)
関数や定数にも別名を付けられます。
@use(function App\Helpers\format_currency, 'formatMoney')
@use(const App\Constants\MAX_ATTEMPTS, 'MAX_TRIES')
まとめ書きも、function と const の両方でできます。
@use(function App\Helpers\{format_currency, format_date})
@use(const App\Constants\{MAX_ATTEMPTS, DEFAULT_TIMEOUT})
フォント#
Vite でフォントを読みこむ設定をしているときは、@fonts を使います。フォントを前もって読みこませるリンク(先読み)と、フォントの CSS を出してくれます。レイアウトの <head> の中に置きます。
<!doctype html>
<head>
{{-- ... --}}
@fonts
@vite('resources/js/app.js')
</head>
@fonts は、vite.config.js に設定したフォントを、全部出します。そのフォントを使う内容より前に置くのがふつうです。
ページで一部のフォントだけ要るときは、フォントの別名(alias)を渡せます。
{{-- Load a single font alias... --}}
@fonts('sans')
{{-- Load multiple font aliases... --}}
@fonts(['sans', 'mono'])
別名は、Vite の設定でフォントを決めるときの alias オプションで付けます。@fonts は Vite ファサードの fonts メソッドを呼んでいるので、直接呼ぶこともできます。
{{ Vite::fonts(['sans', 'mono']) }}
コメント#
Blade のコメントは、HTML のコメントとちがい、出力される HTML に入りません。
{{-- 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 対策のページです。
<form method="POST" action="/profile">
@csrf
...
</form>
メソッドの隠し入力欄#
HTML のフォームは PUT・PATCH・DELETE で送れません。そこで、_method という隠し入力欄で、そのふりをします。@method で作れます。
<form action="/foo/bar" method="POST">
@method('PUT')
...
</form>
入力のエラー#
@error は、その入力欄にバリデーション(入力のチェック)のエラーがあるかを調べます。中では $message で、エラーの文を表示できます。
<!-- /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 も使えます。
<!-- /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つ目の引数に、エラーのまとまり(エラーバッグ)の名前を渡せます。
<!-- /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> へ出したいときに便利です。
@push('scripts')
<script src="/example.js"></script>
@endpush
@pushIf は、条件が true のときだけ積みます。
@pushIf($shouldPush, 'scripts')
<script src="/example.js"></script>
@endPushIf
何度でも積めます。積んだ中身を全部出すには、@stack にスタックの名前を渡します。
<head>
<!-- Head Contents -->
@stack('scripts')
</head>
先頭に積みたいときは @prepend です。
@push('scripts')
This will be second...
@endpush
// Later...
@prepend('scripts')
This will be first...
@endprepend
@hasstack で、スタックが空かどうかを調べられます。
@hasstack('list')
<ul>
@stack('list')
</ul>
@endif
| ディレクティブ | 説明 |
|---|---|
@push |
スタックの後ろに積む |
@pushIf |
条件が true のとき、後ろに積む |
@prepend |
スタックの先頭に積む |
@stack |
積んだ中身を全部出す |
@hasstack |
スタックに中身があるか調べる |
サービスの注入#
@inject は、サービスコンテナ(クラスを作って渡してくれる、道具箱のようなしくみ)から、道具(サービス)を取り出します。1つ目の引数は、入れる変数の名前、2つ目はクラスかインターフェース(クラスが持つべきメソッドの決まり)の名前です。
@inject('metrics', 'App\Services\MetricsService')
<div>
Monthly Revenue: {{ $metrics->monthlyRevenue() }}.
</div>
文字列から Blade を表示する#
Blade の書き方で書いた文字列を、HTML にしたいときは、Blade ファサードの render メソッドを使います。2つ目の引数に、テンプレートへ渡すデータの配列を付けられます。
use Illuminate\Support\Facades\Blade;
return Blade::render('Hello, {{ $name }}', ['name' => 'Julian Bashir']);
この方法では、一時的なファイルを storage/framework/views に書き出します。表示したあとに消したいときは、deleteCachedView 引数を付けます。
return Blade::render(
'Hello, {{ $name }}',
['name' => 'Julian Bashir'],
deleteCachedView: true
);
Blade の一部だけを返す(フラグメント)#
Turbo や htmx(ページ全体を読みなおさずに、一部だけを書きかえるしくみ)を使うとき、Blade のテンプレートの一部分だけを返したいことがあります。それが「フラグメント」です。返したい部分を @fragment と @endfragment で囲みます。
@fragment('user-list')
<ul>
@foreach ($users as $user)
<li>{{ $user->name }}</li>
@endforeach
</ul>
@endfragment
ビューを返すとき、fragment メソッドで、その部分だけを返すように指定します。
return view('dashboard', ['users' => $users])->fragment('user-list');
fragmentIf は、条件が合うときだけフラグメントを返し、合わないときはビュー全体を返します。
return view('dashboard', ['users' => $users])
->fragmentIf($request->hasHeader('HX-Request'), 'user-list');
fragments と fragmentsIf は、複数のフラグメントを返します。つなげて返されます。
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
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 echo ($var)->format('m/d/Y H:i'); ?>
注意
ディレクティブの中身を直したら、取っておかれた Blade のビューを全部消す必要があります。view:clear という Artisan コマンド(php artisan で動かすコマンド)で消せます。
自分のクラスの表示のしかた#
Blade でオブジェクトを表示すると、そのオブジェクトの __toString メソッド(PHP が文字にするときに呼ぶ決まったメソッド)が呼ばれます。ただし、外部のライブラリのクラスなどは、自分で __toString を直せません。
そんなときは、Blade の stringable メソッドで、そのクラスの表示のしかたを登録できます。関数の引数には、表示のしかたを決めたいクラスを、型として書きます。ふつうは AppServiceProvider の boot メソッドで呼びます。
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');
});
}
登録したあとは、テンプレートでそのまま表示できます。
Cost: {{ $money }}
自分の if 文#
単純な条件のためには、ディレクティブを作るのは大げさです。Blade::if を使うと、関数で、条件のディレクティブをかんたんに作れます。次の例は、使っているディスク(ファイルの保存先)の設定を調べます。
use Illuminate\Support\Facades\Blade;
/**
* Bootstrap any application services.
*/
public function boot(): void
{
Blade::if('disk', function (string $value) {
return config('filesystems.default') === $value;
});
}
作ったあとは、テンプレートで使えます。
@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日時点の内容をもとに、日本語でまとめています。