📘
Laravel Filamentで請求システム作る No7 画面で権限を操作
前回に引き続きFilamentで請求システムを作っていきます
前回はbasePolicy.phpでpolicyを簡単に扱えるようにしたので、
今回は画面を作っていきます。
ユーザー詳細画面に「UserHasPolicy」テーブルのレコードを追加・変更できる機能を追加します。
公式ドキュメントを読むと
filamentではリレーションマネージャーを定義すると、行けるみたい
今回は「User」モデルと「UserHasPolicy」モデルはHasManyの関係なので、
リピーターという概念らしい
とは言えリレーションマネージャーを作成するのは同じ模様
コマンドはこんな感じらしい
php artisan make:filament-relation-manager <親リソースクラス> <子モデルの関係> <子モデルのレコード識別カラム>
リレーションマネージャーを作る
今回は、
./vendor/bin/sail artisan make:filament-relation-manager UserResource userHasPolicy model_name
になるのかな?

app/Filament/Resources/UserResource/RelationManagers/UserHasPolicyRelationManager.phpができたっぽい。
出来たphpの中身を確認する
app/Filament/Resources/UserResource/RelationManagers/UserHasPolicyRelationManager.php
<?php
namespace App\Filament\Resources\UserResource\RelationManagers;
use Filament\Forms;
use Filament\Forms\Form;
use Filament\Resources\RelationManagers\RelationManager;
use Filament\Tables;
use Filament\Tables\Table;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\SoftDeletingScope;
class UserHasPolicyRelationManager extends RelationManager
{
    protected static string $relationship = 'userHasPolicy';
    public function form(Form $form): Form
    {
        return $form
            ->schema([
                Forms\Components\TextInput::make('model_name')
                    ->required()
                    ->maxLength(255),
            ]);
    }
    public function table(Table $table): Table
    {
        return $table
            ->recordTitleAttribute('model_name')
            ->columns([
                Tables\Columns\TextColumn::make('model_name'),
            ])
            ->filters([
                //
            ])
            ->headerActions([
                Tables\Actions\CreateAction::make(),
            ])
            ->actions([
                Tables\Actions\EditAction::make(),
                Tables\Actions\DeleteAction::make(),
            ])
            ->bulkActions([
                Tables\Actions\BulkActionGroup::make([
                    Tables\Actions\DeleteBulkAction::make(),
                ]),
            ]);
    }
}
ちょっと現状では、model_nameだけしか表示されてないので、もうちょっと手直しはしたいな。
一応画面を見てみる
ユーザーの詳細画面を見てみるも、何も表示されてねぇ~www

UserResourceの編集
app\Filament\Resources\UserResource.phpの'getRelations()'にリレーションの情報を追加せよとなってます。
app\Filament\Resources\UserResource.php
    public static function getRelations(): array
    {
        return [
-            //
+            RelationManagers\UserHasPolicyRelationManager::class,
        ];
    }
これで画面を見ると追加されました。

table定義をする
とは言え、見た目的にどうなのって話なので、調整する
タイトル部分とボタン
最初は全て、「UserHasPolicy」と表示されるので、
日本語に変更する
app\Filament\Resources\UserResource\RelationManagers\UserHasPolicyRelationManager.php
class UserHasPolicyRelationManager extends RelationManager
{
    protected static ?string $modelLabel = '権限';
    protected static ?string $title = '権限';

次回
今回は、Filamentのリレーションマネージャーでリレーション先のデータを表示する所までつくりました。
次回は、権限の一覧部分に対して機能を乗せていきます。
Discussion