Open4

Filament phpを使ってみる

shieWorksshieWorks

初めに

管理画面を作成するのに、早く正確に作る方法を考えると、
少なくとも、nuxetやらnextやらは違うので、
ちゃっちゃっとできるlaravel-admin的な物を探していました。

んで、見つけたのがfilament
何がいけてるかというと、
data-tableがチャチャっと作れる所。
とりあえずやってみようwww

laravel10のインストール

チャチャっと行きたいので、sailで行きます。

今回はfilamentとした。

curl -s https://laravel.build/filament | bash

/filament の部分がフォルダ名になる。
特に

かなり時間がかかるけど、laravel sailがインストールされる

終わったら、

cd filament
./vendor/bin/sail up

でsailを起動してlaravel10が上手く起動するか確認する。

ブラウザでlocalhostにアクセスしてlaravelが開くか確認する 

開いたので、一回sailをダウンする

./vendor/bin/sail down

filamentをインストールする

filamentフォルダ内で

./vendor/bin/sail up -d

でバックグラウンドでsailを立ち上げた状態で

./vendor/bin/sail composer require filament/filament:"^3.0-stable" -W

完了すると

./vendor/bin/sail artisan filament:install --panels

実行すると。

たぶん一人目のIDかな?
「admin」のままで行く事にしたのでそのまま何もせずにキーボードのenterを押した

そうすると、うちゃ~っと何かが動いたのて、
なんか聞かれる。

google翻訳すると「すべて完了! GitHub の Filament リポジトリにスターを付けて愛を示してみませんか?」との事なので、
今回はしない事として「No」を選んでenter

完了したみたい

この状態で
http://localhost/admin/login
にアクセスすると

こんな感じで
filamentログイン画面が表示される

最初のユーザーを作成する

マイグレーションをしてないので、先にマイグレーションする

./vendor/bin/sail artisan migrate

filamentユーザー作成でユーザーを作成する

./vendor/bin/sail artisan make:filament-user

こんな感じでコマンドライン上で聞かれるから入力したらユーザーが作成される

ログイン用の情報

種類 内容
email admin@admin.com
password pass

作成したユーザー情報でアクセスする

ログインできた!

shieWorksshieWorks

とりあえず、チュートリをして、全体像をつかむ

公式ではここhttps://filamentphp.com/docs/3.x/panels/getting-started

モデルとマイグレーションファイルを作る。

./vendor/bin/sail artisan make:model Owner -m
./vendor/bin/sail artisan make:model Patient -m
./vendor/bin/sail artisan make:model Treatment -m

上から、飼い主、患者(のペット)、診察記録

こうすると、database/migrations/の中にマイグレーションファイルができるので、テーブル構造を書いていく

テーブルを作成するためのマイグレーションファイルを書く

飼い主(owners)テーブルの内容

database\migrations<datetimestring>_create_owners_table.php

database\migrations\<datetimestring>_create_owners_table.php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class extends Migration
{
    /**
     * Run the migrations.
     */
    public function up(): void
    {
        Schema::create('owners', function (Blueprint $table) {
            $table->id();
            $table->string('email');
            $table->string('name');
            $table->string('phone');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     */
    public function down(): void
    {
        Schema::dropIfExists('owners');
    }
};

同じように他のモデル(テーブル)のマイグレーションファイルも書いていく

患者(patients)テーブル

<datetimestring>_create_patients_table.php
        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();
        });

診察履歴(treatments)テーブル

<datetimestring>_create_treatments_table.php
        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();
        });

マイグレーションファイルを書いたので、コマンドを叩いてテーブルを作成する

./vendor/bin/sail artisan migrate

出来た

Eloquentの保護機能を解除する

普通はやっちゃだめだよwww
今回は簡単に話しを進める為にとりあえず解除する。らしい・・・

app/Providers/AppServiceProvider.phpをこんな風に変える

app/Providers/AppServiceProvider.php
namespace App\Providers;

use Illuminate\Support\ServiceProvider;
use Illuminate\Database\Eloquent\Model; //追加

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

    /**
     * Bootstrap any application services.
     */
    public function boot(): void
    {
        Model::unguard(); //追加
    }
}

一旦これで、テーブルとモデルができた。

shieWorksshieWorks

リレーションを作る

飼い主は複数の患者のペットを飼ってる事が有るから、
1:多=飼い主:患者のペット

app\Models\Owner.php
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany; //追加

class Owner extends Model
{
    use HasFactory;

    public function patients(): HasMany //この関数をマルっと追加
    {
        return $this->hasMany(Patient::class);
    }
}

患者のペットは飼い主の逆で、なおかつ患者には複数の診察履歴が有るから、

app\Models\Patient.php
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; //追加
use Illuminate\Database\Eloquent\Relations\HasMany; //追加

class Patient extends Model
{
    use HasFactory;

    public function owner(): BelongsTo //この関数をマルっと追加
    {
        return $this->belongsTo(Owner::class);
    }
 
    public function treatments(): HasMany //この関数をマルっと追加
    {
        return $this->hasMany(Treatment::class);
    }
}

診察履歴は患者の逆だから

app\Models\Treatment.php
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo; //追加

class Treatment extends Model
{
    use HasFactory;

    public function patient(): BelongsTo //この関数をマルっと追加
    {
        return $this->belongsTo(Patient::class);
    }
}
shieWorksshieWorks

患者画面の作成

./vendor/bin/sail artisan make:filament-resource Patient

実行すると、app/Filament/Resources/の中にPatientResourceというフォルダができる
中身はこんな感じ

+-- PatientResource.php
+-- PatientResource
|   +-- Pages
|   |   +-- CreatePatient.php
|   |   +-- EditPatient.php
|   |   +-- ListPatients.php

この状態でhttp://localhost/adminにアクセスすると
下の図のように、サイドバーに「Patients」が追加される。

せっかくなのでサイドバーの「Patients」を日本語化する

app\Filament\Resources\PatientResource.php
namespace App\Filament\Resources;

use App\Filament\Resources\PatientResource\Pages;
//...省略
use Illuminate\Database\Eloquent\SoftDeletingScope;

class PatientResource extends Resource
{
    protected static ?string $navigationLabel = '患者';//追加
    protected static ?string $model = Patient::class;
//...以下省略

日本語になった