📘

Laravel Filamentで請求システム作る No7 画面で権限を操作

2023/12/02に公開

前回に引き続きFilamentで請求システムを作っていきます

前回はbasePolicy.phpでpolicyを簡単に扱えるようにしたので、
今回は画面を作っていきます。
ユーザー詳細画面に「UserHasPolicy」テーブルのレコードを追加・変更できる機能を追加します。

公式ドキュメントを読むと

filamentではリレーションマネージャーを定義すると、行けるみたい
https://filamentphp.com/docs/3.x/panels/resources/relation-managers

今回は「User」モデルと「UserHasPolicy」モデルはHasManyの関係なので、
リピーターという概念らしい
https://filamentphp.com/docs/3.x/panels/resources/relation-managers#repeaters---crud-multiple-related-records-inside-the-owners-form

とは言えリレーションマネージャーを作成するのは同じ模様
コマンドはこんな感じらしい

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