FilamentPHP — w pełni funkcjonalny panel admina w jeden dzień

FilamentPHP to biblioteka do budowania paneli administracyjnych w Laravelu. Opisuję co dostałem za darmo i co musiałem dostosować, żeby połączyć go z zewnętrznym API.

Czym jest FilamentPHP?

FilamentPHP to zestaw komponentów Livewire do budowania CRUD-owych paneli administracyjnych. Dostarcza:

  • Tabele z sortowaniem, filtrowaniem, paginacją
  • Formularze z walidacją
  • Widgety (wykresy, statystyki)
  • Ciemny motyw
  • System powiadomień

Tradycyjny panel admina w Laravel zajmuje kilka dni. Z Filamentem — kilka godzin.

Konfiguracja zasobu

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

    public static function form(Form $form): Form
    {
        return $form->schema([
            TextInput::make('title')->required()->maxLength(255),
            TextInput::make('slug')->required()->unique(ignoreRecord: true),
            Textarea::make('excerpt')->rows(3),
            MarkdownEditor::make('content')->required()->columnSpanFull(),
            Select::make('status')
                ->options(['draft' => 'Szkic', 'published' => 'Opublikowany', 'archived' => 'Archiwum'])
                ->required(),
            DateTimePicker::make('published_at'),
            Select::make('categories')
                ->relationship('categories', 'name')
                ->multiple()
                ->preload(),
        ]);
    }

    public static function table(Table $table): Table
    {
        return $table
            ->columns([
                TextColumn::make('title')->searchable()->sortable(),
                BadgeColumn::make('status')
                    ->colors(['warning' => 'draft', 'success' => 'published', 'secondary' => 'archived']),
                TextColumn::make('published_at')->dateTime()->sortable(),
            ])
            ->filters([
                SelectFilter::make('status')->options([...]),
            ]);
    }
}

Problem: Filament + zewnętrzne SSO

Domyślnie Filament używa standardowego auth Laravela (sesja, guards). Mój admin potrzebował logowania przez SSO (OAuth2).

Musiałem:

  1. Wyłączyć domyślną stronę logowania Filamenta
  2. Zaimplementować własny AuthController który robi redirect do SSO
  3. Po powrocie z SSO (z tokenem) ustawić sesję Filamenta
// AdminPanelProvider.php
->login(CustomSsoLogin::class)
->authGuard('web')
class CustomSsoLogin extends SimplePage
{
    public function mount(): void
    {
        // Redirect natychmiast do SSO zamiast pokazywać formularz
        redirect()->to(route('sso.redirect'));
    }
}

Zarządzanie komentarzami

Moderacja komentarzy to jedno z głównych zastosowań panelu. Custom action w tabeli:

TablesActionsAction::make('approve')
    ->label('Zatwierdź')
    ->icon('heroicon-o-check')
    ->color('success')
    ->action(function (Comment $record) {
        $record->update(['status' => 'approved']);
        $this->notify('success', 'Komentarz zatwierdzony');
    })
    ->visible(fn (Comment $record) => $record->status === 'pending'),

Co mi się podoba?

Filament pozwolił mi skupić się na logice biznesowej zamiast na pisaniu kolejnych tabel HTML. Jeden plik PostResource.php zastępuje controller, widoki, formularze i walidację.

Comments

No comments yet