Files
Laravel-Docker-Dev-Template/docs/filament-admin.md
2026-03-06 08:57:05 +02:00

5.4 KiB

Filament Admin Panel

This template includes optional Filament admin panel setup for user management and administration.

What is Filament?

Filament is a full-stack admin panel framework for Laravel built on Livewire. It provides:

  • Admin Panel - Beautiful, responsive dashboard
  • Form Builder - Dynamic forms with validation
  • Table Builder - Sortable, searchable, filterable tables
  • User Management - CRUD for users out of the box
  • Widgets - Dashboard stats and charts
  • Notifications - Toast notifications
  • Actions - Bulk actions, row actions

Installation

Filament is installed via make setup-laravel when you select "Yes" for admin panel.

Manual installation:

composer require filament/filament:"^3.2" -W
php artisan filament:install --panels
php artisan make:filament-user
php artisan make:filament-resource User --generate

Accessing Admin Panel

  • URL: http://localhost:8080/admin
  • Login: Use credentials created during setup

User Management

The setup creates a UserResource at app/Filament/Resources/UserResource.php.

This provides:

  • List all users with search/filter
  • Create new users
  • Edit existing users
  • Delete users

Customizing User Resource

Edit app/Filament/Resources/UserResource.php:

public static function form(Form $form): Form
{
    return $form
        ->schema([
            Forms\Components\TextInput::make('name')
                ->required()
                ->maxLength(255),
            Forms\Components\TextInput::make('email')
                ->email()
                ->required()
                ->unique(ignoreRecord: true),
            Forms\Components\DateTimePicker::make('email_verified_at'),
            Forms\Components\TextInput::make('password')
                ->password()
                ->dehydrateStateUsing(fn ($state) => Hash::make($state))
                ->dehydrated(fn ($state) => filled($state))
                ->required(fn (string $context): bool => $context === 'create'),
        ]);
}

public static function table(Table $table): Table
{
    return $table
        ->columns([
            Tables\Columns\TextColumn::make('name')
                ->searchable(),
            Tables\Columns\TextColumn::make('email')
                ->searchable(),
            Tables\Columns\TextColumn::make('email_verified_at')
                ->dateTime()
                ->sortable(),
            Tables\Columns\TextColumn::make('created_at')
                ->dateTime()
                ->sortable()
                ->toggleable(isToggledHiddenByDefault: true),
        ])
        ->filters([
            //
        ])
        ->actions([
            Tables\Actions\EditAction::make(),
            Tables\Actions\DeleteAction::make(),
        ])
        ->bulkActions([
            Tables\Actions\BulkActionGroup::make([
                Tables\Actions\DeleteBulkAction::make(),
            ]),
        ]);
}

Adding Roles & Permissions

For role-based access, add Spatie Permission:

composer require spatie/laravel-permission
php artisan vendor:publish --provider="Spatie\Permission\PermissionServiceProvider"
php artisan migrate

Then install Filament Shield for admin UI:

composer require bezhansalleh/filament-shield
php artisan shield:install

This adds:

  • Role management in admin
  • Permission management
  • Protect resources by role

Creating Additional Resources

# Generate resource for a model
php artisan make:filament-resource Post --generate

# Generate with soft deletes
php artisan make:filament-resource Post --generate --soft-deletes

# Generate simple (modal-based, no separate pages)
php artisan make:filament-resource Post --simple

Dashboard Widgets

Create a stats widget:

php artisan make:filament-widget StatsOverview --stats-overview

Edit app/Filament/Widgets/StatsOverview.php:

protected function getStats(): array
{
    return [
        Stat::make('Total Users', User::count()),
        Stat::make('Verified Users', User::whereNotNull('email_verified_at')->count()),
        Stat::make('New Today', User::whereDate('created_at', today())->count()),
    ];
}

Restricting Admin Access

By Email Domain

In app/Providers/Filament/AdminPanelProvider.php:

->authGuard('web')
->login()
->registration(false) // Disable public registration

By User Method

Add to User model:

public function canAccessPanel(Panel $panel): bool
{
    return str_ends_with($this->email, '@yourcompany.com');
}

Or with roles:

public function canAccessPanel(Panel $panel): bool
{
    return $this->hasRole('admin');
}

Customizing Theme

Publish and customize:

php artisan vendor:publish --tag=filament-config
php artisan vendor:publish --tag=filament-panels-translations

Edit colors in app/Providers/Filament/AdminPanelProvider.php:

->colors([
    'primary' => Color::Indigo,
    'danger' => Color::Rose,
    'success' => Color::Emerald,
])

Production Considerations

  1. Disable registration in admin panel
  2. Use strong passwords for admin users
  3. Enable 2FA if using Jetstream
  4. Restrict by IP in production if possible
  5. Monitor admin actions via activity logging

Resources