🐥

Laravelで管理画面を簡単に構築できる「Filament」の紹介

2025/02/21に公開

はじめに

Laravelで管理画面をさくっと作りたいときありますよね。

そのために、

  • Laravelの知識で画面も作りたい
  • ログイン画面からデータの一覧表示、新規作成~削除まで作りたい(プラグインを個別に入れない)
  • モダンなデザイン
  • ある程度の日本語の画面
  • 基本機能は無料

ぐらいできるとうれしいです。

「Filament」はこの要件をかなえてくれます。


デザインもモダンですね

Laravelに組み込まれているので、artisanコマンドで各ページの作成などが行えます。
また、インストール時にログイン画面は即生成され(デフォルトUserテーブル)の情報でログインできます。

そして、一覧表示・新規作成~削除ページ作成も

# モデル名でページ作成
php artisan make:filament-resource モデル名

で、一発生成!!
からのPHPでフォームを記載すると

// 画面に表示したい入力フォーム
Forms\Components\TextInput::make('カラム名')

一発でフォーム生成。カラム名のデータ変更を変更する画面ができました。

ありがとう「Filament」

デザインが気になる人は、デモページで表示を確認できます。

デモページ↓
https://demo.filamentphp.com/

公式ページはこちら↓
https://filamentphp.com/

作ってみよう

実際どれくらいの手軽なのか気になるところです。
ログイン・一覧・新規作成・編集・削除ページまでを作ってみます。

公式のドキュメントが充実しているので、それに沿って構築します。

ドキュメントのチュートリアル
https://filamentphp.com/docs/3.x/panels/getting-started

前提条件

Laravel をインストールして、DBに接続してください。
(記事作成時点は、Laravel 11です)

envファイルに日本設定を行います

.env
APP_TIMEZONE=Asia/Tokyo

APP_LOCALE=ja
APP_FALLBACK_LOCALE=ja
APP_FAKER_LOCALE=ja_JP

Filamentインストール

LaravelにFilamentを導入します。

# composerでインストール
composer require filament/filament:"^3.2" -W

# セットアップコマンド
php artisan filament:install --panels

セットアップ時にFilamentのID(URLのパス)を決めます。
デフォルトは、"admin"

セットアップが終わった段階で、IDをブラウザで開くとログイン画面が表示されます。
例) laravelドメイン/admin

自動的に日本語表示になっていますね。かしこい!

ログインユーザ作成

Laravelのユーザを作成していない場合は、作成します。

ユーザーを追加するコマンド

# tinkerに入る
php artisan tinker

# ユーザを作成
$user = new User;
$user->name = "ユーザー名";
$user->email = "メールアドレス";
$user->password = Hash::make('パスワード');
$user->save();

# tinkerを抜ける
exit

ログインページから作成したユーザでログインできることを確認します

ログイン画面構築完了です!!

リソースの作成

DBの内容を"表示"・"新規作成”・”編集"・”削除”を行う「リソース」ページを作成します。

サンプルデータの作成

まずは、サンプルのデータベースを作成します。

php artisan make:model Owner --migration

php artisan make:model Patient --migration

php artisan make:model Treatment --migration
作成されたマイグレーションファイルをそれぞれ以下の形に変更します。
// create_owners_table
Schema::create('owners', function (Blueprint $table) {
   $table->id();
   $table->string('email');
   $table->string('name');
   $table->string('phone');
   $table->timestamps();
});
// create_patients_table
Schema::create('patients', function (Blueprint $table) {
    $table->id();
    $table->date('date_of_birth');
    $table->string('name');
    $table->foreignId('owner_id')->constrained('owners')->cascadeOnDelete();
    $table->string('type');
    $table->timestamps();
});
// create_treatments_table
Schema::create('treatments', function (Blueprint $table) {
    $table->id();
    $table->string('description');
    $table->text('notes')->nullable();
    $table->foreignId('patient_id')->constrained('patients')->cascadeOnDelete();
    $table->unsignedInteger('price')->nullable();
    $table->timestamps();
});
作成されたモデルをそれぞれ以下の形に変更します。
// 各ファイルにuseを追加
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;

// Owner.php
class Owner extends Model
{
    protected $guarded = ['created_at', 'updated_at'];


    public function patients(): HasMany
    {
        return $this->hasMany(Patient::class);
    }
}
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;

// Patient.php
class Patient extends Model
{
    protected $guarded = ['created_at', 'updated_at'];

    public function owner(): BelongsTo
    {
        return $this->belongsTo(Owner::class);
    }
 
    public function treatments(): HasMany
    {
        return $this->hasMany(Treatment::class);
    }
}
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\HasMany;

// Treatment.php
class Treatment extends Model
{
    protected $guarded = ['created_at', 'updated_at'];

    public function patient(): BelongsTo
    {
        return $this->belongsTo(Patient::class);
    }
}
マイグレーションをDBへ適用
php artisan migrate

デモ用のDBはできました。

リリースの作成

デモDB用の管理ページを作成します。
make:filament-resource (モデル名) コマンドで作成できます。

Patientのページを作成します。

php artisan make:filament-resource Patient

app/Filament/Resourcesに以下のファイルが作成されます
.
+-- PatientResource.php
+-- PatientResource
| +-- Pages
| | +-- CreatePatient.php
| | +-- EditPatient.php
| | +-- ListPatients.php

ブラウザで/admin/patientsにアクセスすることでページが表示されます

「新規作成」フォームを作成する

入力フォームを追加します。

PatientResource.phpの "function form"を以下に書き換えます。

use Filament\Forms;
use Filament\Forms\Form;
 
public static function form(Form $form): Form
{
    return $form
        ->schema([
            Forms\Components\TextInput::make('name'),
        ]);
}

/admin/patients/createにブラウザでアクセスすると、テキスト入力のフォームが表示されます。

入力規則を追加しましょう。
入力規則「必須」「最大長は 255 文字」を追加します。
PatientResource.phpを書き換えます。

use Filament\Forms;
use Filament\Forms\Form;

public static function form(Form $form): Form
{
    return $form
        ->schema([
            Forms\Components\TextInput::make('name')
            ->required()
            ->maxLength(255)
        ]);
}

未入力でフォームを進めるとメッセージが表示されます。
このように、「入力フォームの種類」「対応するカラム名」「入力規則」を入れるだけで機能を作れます。

フォームの配列を追加することで、複数の項目を作ることができます。
また、テキスト以外のタイプも作ることができます。
必要なものをすべて追加すると以下の形です
(ドキュメントでは丁寧に解説しています)

use Filament\Forms;
use Filament\Forms\Form;

public static function form(Form $form): Form
{
    return $form
        ->schema([
            Forms\Components\TextInput::make('name')
                ->required()
                ->maxLength(255),
            Forms\Components\Select::make('type')
                ->options([
                    'cat' => 'Cat',
                    'dog' => 'Dog',
                    'rabbit' => 'Rabbit',
                ])
                ->required(),
            Forms\Components\DatePicker::make('date_of_birth')
                ->required()
                ->maxDate(now()),
            Forms\Components\Select::make('owner_id')
                ->relationship('owner', 'name')
                ->searchable()
                ->preload()
                ->createOptionForm([
                    Forms\Components\TextInput::make('name')
                        ->required()
                        ->maxLength(255),
                    Forms\Components\TextInput::make('email')
                        ->label('Email address')
                        ->email()
                        ->required()
                        ->maxLength(255),
                    Forms\Components\TextInput::make('phone')
                        ->label('Phone number')
                        ->tel()
                        ->required(),
                ])
                ->required()
        ]);

}

新規作成ページ画面構築完了です!!

「一覧」を作成する

PatientResource.php"function table"に表示したいカラムを追加するだけです。

use Filament\Tables;
use Filament\Tables\Table;
 
public static function table(Table $table): Table
{
    return $table
        ->columns([
            Tables\Columns\TextColumn::make('name'),
            Tables\Columns\TextColumn::make('type'),
            Tables\Columns\TextColumn::make('date_of_birth'),
            Tables\Columns\TextColumn::make('owner.name'),
        ])
            ->filters([
                //
            ])
            ->actions([
                Tables\Actions\EditAction::make(),
            ])
            ->bulkActions([
                Tables\Actions\BulkActionGroup::make([
                    Tables\Actions\DeleteBulkAction::make(),
                ]),
            ]);
}

一覧を表示することができるようになりました。
さらに、カラムに絞り込みやソートを追加することができます。

public static function table(Table $table): Table
{
    public static function table(Table $table): Table
    {
        return $table
            ->columns([
                //
                Tables\Columns\TextColumn::make('name')
                    ->searchable(),
                Tables\Columns\TextColumn::make('type'),
                Tables\Columns\TextColumn::make('date_of_birth')
                    ->sortable(),
                Tables\Columns\TextColumn::make('owner.name')
                    ->searchable(),
            ])
            ->filters([
                //
            ])
            ->actions([
                Tables\Actions\EditAction::make(),
            ])
            ->bulkActions([
                Tables\Actions\BulkActionGroup::make([
                    Tables\Actions\DeleteBulkAction::make(),
                ]),
            ]);
    }
}

一覧ページに絞り込みやソートが追加されました。

一覧の画面構築完了です!!

そして、なんということでしょう。
編集・削除の画面も構築完了です!!

おわり

管理ページを非常に簡単に作ることができました。
気になってきた人は、チュートリアルを行ってください。

https://filamentphp.com/docs/3.x/panels/getting-started

Discussion