Bladeコンポーネントの使い方(Laravel)
投稿日:2026/01/15
LaravelのView(Blade)では、画面の部品を Bladeコンポーネント として切り出すことができます。 ボタン・フォーム・カードなどのUI部品を再利用可能な単位で管理できるため、Viewの可読性と保守性が大きく向上します。
本記事では、Bladeコンポーネントの基本的な使い方について、次の内容を解説します。
- Bladeコンポーネントとは何か
- コンポーネントの作成方法
- 値(props)の受け渡し方法
- レイアウトとの使い分け
- 利用シーン
Bladeコンポーネントとは?
Bladeコンポーネントとは、Viewの一部を部品化して再利用できる仕組みです。
たとえば、次のようなUIは複数画面で共通化されがちです。
- ボタン
- 入力フォーム
- エラーメッセージ表示
- カードレイアウト
- モーダル
これらをBladeファイルとして切り出し、
コンポーネントの作成方法
artisanコマンドで作成する
以下のコマンドでコンポーネントを作成します。
php artisan make:component PrimaryButton
作成されるファイルは次の2つです。
app/View/Components/PrimaryButton.php
resources/views/components/primary-button.blade.php
- PHPクラス:ロジック・props定義
- Bladeファイル:HTMLテンプレート
※ 表示だけで完結する場合は、Bladeファイルのみ使用しても問題ありません。
コンポーネントの中身を作る
Bladeファイルを編集する
🔽 resources/views/components/primary-button.blade.php
<button class="px-4 py-2 bg-blue-600 text-white rounded">
{{ $slot }}
</button>
$slot には、コンポーネントタグで囲んだ中身が入ります。
コンポーネントを呼び出す
任意のViewから、次のように使用できます。
<x-primary-button>
保存する
</x-primary-button>
この記述は、HTML上では buttonタグとして展開されます。
props(値)を渡す
propsを受け取る
Blade側で @props を使って値を受け取ります。
@props([
'type' => 'button',
])
<button type="{{ $type }}" class="px-4 py-2 bg-blue-600 text-white rounded">
{{ $slot }}
</button>
呼び出し側から値を渡す
<x-primary-button type="submit">
登録する
</x-primary-button>
動的な値を渡す場合は : を付けます。
<x-primary-button :type="$buttonType">
送信
</x-primary-button>
属性(class・idなど)を透過的に渡す
コンポーネント側で $attributes を使うと、
呼び出し元から指定されたHTML属性をそのまま引き継げます。
<button {{ $attributes->merge(['class' => 'px-4 py-2 rounded']) }}>
{{ $slot }}
</button>
呼び出し側:
<x-primary-button class="bg-red-500">
削除
</x-primary-button>
classは自動的にマージされます。
レイアウトとコンポーネントの使い分け
| 用途 | 使うもの |
|---|---|
| ページ全体の枠組み | レイアウト(@extends) |
| ボタン・フォームなどの部品 | Bladeコンポーネント |
| 繰り返し使う小さなUI | Bladeコンポーネント |
「ページ構造」 か 「部品」 かで使い分けるのが基本です。
よくある利用シーン
- 共通ボタン(保存・削除など)
- 入力フォーム部品
- エラー表示コンポーネント
- タグ・バッジ表示
- モーダルダイアログ
BreezeやJetstreamのViewを見ると、
多くのコンポーネントが使われていることが確認できます。
Bladeコンポーネントでやってはいけないこと
- DBアクセスを書く
- Serviceを呼び出す
- 重いビジネスロジックを書く
コンポーネントは 「表示ロジック」に限定する のが原則です。
まとめ
- BladeコンポーネントはViewの部品化・再利用の仕組み
タグで直感的に使える - props・slot・attributesで柔軟にカスタマイズできる
- Viewの肥大化防止に非常に効果的