Laravel Filamentの使い方|インストール手順と管理画面の作り方

実装・応用テクニック

Laravel Filamentは、Laravelアプリケーションに管理画面(Admin Panel)を高速に追加できるフルスタックのパッケージです。本記事では、Laravel 13 + PHP 8.3 + Filament v4.12環境で実際にコマンドを実行しながら検証した内容をもとに、インストール手順から管理者ユーザーの作成、CRUD管理画面の構築、日本語化までを解説します。

Laravel Filamentとは?

Laravel Filamentは、Livewireをベースに構築されたLaravel向けのフルスタックフレームワークです。管理画面でよく必要になる「一覧・作成・編集・削除(CRUD)」の実装を、コマンド1つと少量のコードで自動生成できる点が最大の特徴です。ライセンスはMITで、無料で利用できます。

従来のLaravel開発での課題 Filamentでの解決方法
CRUD画面を毎回手作業でコーディングする必要がある 1コマンドでリソースを自動生成し、一覧・作成・編集画面がすぐ使える
フォームのバリデーションやUI実装が煩雑 TextInputやToggleなどのコンポーネントを宣言的に組み立てるだけで完結
管理画面のデザインを一から作る必要がある Tailwind CSSベースのUIが標準搭載され、レスポンシブにも対応済み
機能拡張やカスタマイズが難しい Livewireベースのため、独自のアクションやウィジェットを柔軟に追加できる

動作要件

Filament v4系を導入する前に、以下のバージョン要件を満たしているか確認します(vendor/filament/support/composer.jsonの依存関係で確認済み)。

  • PHP 8.2以上
  • Laravel 11.28以上(Laravel 12・13系にも対応)
  • Livewire 3系(Filamentのインストール時に自動で導入される)

Laravel Filamentのインストール手順

既存のLaravelプロジェクトにFilamentを追加する手順です。まずComposerでパッケージを導入します。

composer require filament/filament:"^4.0" -W

インストール後、管理パネルを初期化するコマンドを実行します。

php artisan filament:install --panels

このコマンドを実行すると、app/Providers/Filament/AdminPanelProvider.phpが生成されます。実際に生成される内容を確認すると、パネルのIDがadmin、アクセスパスがadminで登録されており、特別な設定をしなくても/adminで管理画面にアクセスできることが分かります。

return $panel
    ->default()
    ->id('admin')
    ->path('admin')
    ->login()
    // ...(省略)
    ->discoverResources(in: app_path('Filament/Resources'), for: 'App\Filament\Resources')
    ->discoverPages(in: app_path('Filament/Pages'), for: 'App\Filament\Pages')
    ->discoverWidgets(in: app_path('Filament/Widgets'), for: 'App\Filament\Widgets');

管理者ユーザーを作成する

管理画面には認証が必須のため、ログイン用のユーザーを作成します。専用のArtisanコマンドが用意されており、対話形式でも、オプションを指定した非対話形式でも作成できます。

php artisan make:filament-user --name="管理者" --email="admin@example.com" --password="password"

実行すると、以下のように作成完了メッセージとログインURLが表示されます。

INFO  Success! admin@example.com may now log in at http://localhost/admin/login.

コマンドの詳細なオプションや、既存ユーザーをFilamentにログインできるようにする方法は、以下の記事でまとめています。

→ make:filament-user — Filamentユーザーを作成するコマンド

管理画面へのアクセスを確認する

開発サーバーを起動し、ブラウザで/admin/loginにアクセスすると、Filamentのログイン画面が表示されます。

php artisan serve

http://127.0.0.1:8000/admin/loginを開き、先ほど作成したメールアドレスとパスワードでログインできれば、セットアップは完了です。

Filamentリソースを作成してCRUD管理画面を構築する

Filamentの中核となるのが「リソース」です。リソースは、特定のEloquentモデルに対する一覧・作成・編集・削除画面を1セットで提供します。ここでは例として、titlebodyis_publishedカラムを持つPostモデルを対象にリソースを作成します。

php artisan make:filament-resource Post --generate

--generateオプションを付けると、既存のマイグレーション定義からフォームとテーブルの項目が自動で組み立てられます。実行すると、次の6ファイルが生成されます(Filament v4では、リソース本体・フォーム定義・テーブル定義が別ファイルに分割される構成になっています)。

app/Filament/Resources/Posts/PostResource.php
app/Filament/Resources/Posts/Schemas/PostForm.php
app/Filament/Resources/Posts/Tables/PostsTable.php
app/Filament/Resources/Posts/Pages/ListPosts.php
app/Filament/Resources/Posts/Pages/CreatePost.php
app/Filament/Resources/Posts/Pages/EditPost.php

リソース本体(PostResource.php)は、フォームとテーブルの定義をそれぞれ別クラスに委譲するだけのシンプルな構成です。

class PostResource extends Resource
{
    protected static ?string $model = Post::class;

    public static function form(Schema $schema): Schema
    {
        return PostForm::configure($schema);
    }

    public static function table(Table $table): Table
    {
        return PostsTable::configure($table);
    }

    public static function getPages(): array
    {
        return [
            'index' => ListPosts::route('/'),
            'create' => CreatePost::route('/create'),
            'edit' => EditPost::route('/{record}/edit'),
        ];
    }
}

この時点で/admin/postsにアクセスすると、一覧・作成・編集画面がすでに動作します。追加のビュー実装は不要です。

フォームのカスタマイズ(PostForm.php)

入力フォームの項目は、Schemas\PostFormクラスのcomponents()配列で定義します。

class PostForm
{
    public static function configure(Schema $schema): Schema
    {
        return $schema
            ->components([
                TextInput::make('title')
                    ->required()
                    ->maxLength(255),
                Textarea::make('body')
                    ->columnSpanFull(),
                Toggle::make('is_published')
                    ->label('公開する')
                    ->default(false),
            ]);
    }
}

required()maxLength()のようなバリデーションルールをメソッドチェーンで付与できるため、フォームリクエストクラスを別途書く必要はありません。

テーブルのカスタマイズ(PostsTable.php)

一覧画面の列や検索・並び替え機能は、Tables\PostsTableクラスで定義します。

class PostsTable
{
    public static function configure(Table $table): Table
    {
        return $table
            ->columns([
                TextColumn::make('title')
                    ->searchable()
                    ->sortable(),
                IconColumn::make('is_published')
                    ->label('公開状態')
                    ->boolean(),
                TextColumn::make('created_at')
                    ->dateTime('Y-m-d H:i')
                    ->sortable(),
            ])
            ->filters([
                // ここにフィルターを追加
            ])
            ->recordActions([
                EditAction::make(),
            ])
            ->toolbarActions([
                BulkActionGroup::make([
                    DeleteBulkAction::make(),
                ]),
            ]);
    }
}

真偽値カラムはBooleanColumnではなくIconColumn::make()->boolean()で表示します(Filament v3以前の記事ではTables\Columns\BooleanColumnが使われていますが、v4では廃止されているため注意してください)。

管理画面を日本語化する

Filamentの標準UIパッケージには日本語の翻訳ファイルが同梱されており、追加パッケージを導入しなくても言語設定を変更するだけで日本語表示に切り替わります。

# .env
APP_LOCALE=ja

設定変更後にログイン画面へアクセスすると、「ログイン」「メールアドレス」「パスワード」のように主要なUI文言が日本語化されていることを確認できました。自作したリソースのラベル(カラム名やフィールド名)は、->label('公開する')のように各コンポーネントで個別に指定します。

よくある質問

Laravel FilamentはNovaやVoyagerと何が違いますか?

Laravel Novaは有料の公式管理パネルパッケージ、Voyagerは開発が停滞気味のOSSパッケージです。Filamentは無料(MITライセンス)でありながら活発に開発が続いており、Livewireベースで独自の画面やウィジェットを追加しやすい点が特徴です。

既存のユーザーをFilamentにログインできるようにするには?

make:filament-userコマンドで新規作成する以外に、既存のUserモデルにFilamentUserインターフェースを実装し、canAccessPanel()メソッドでログイン可否を制御する方法もあります。

管理画面のパスを/admin以外に変更できますか?

できます。AdminPanelProvider->path('admin')部分を任意の文字列に書き換えることで、アクセスパスを変更可能です。

本番環境にデプロイする前に実行すべきコマンドはありますか?

デプロイ時にはコンポーネントのキャッシュを最適化するfilament:optimizeの実行が推奨されています。詳細は以下の記事を参照してください。

→ filament:optimize — Filamentを最適化するコマンド

まとめ

Laravel Filamentを使うと、CRUD管理画面をコマンド1つとわずかなコード量で構築できます。本記事の手順は、実際にLaravel 13 + PHP 8.3 + Filament v4.12環境で動作確認したものです。導入後にキャッシュ関連のコマンドでつまずいた場合は、以下の記事もあわせて参考にしてください。

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする

コメント