Увійти Реєстрація
Блог Серії
Кар'єра
Вакансії Компанії
Навчання
Документація Співбесіди Тестування Відео
Екосистема
Пакети Ресурси Проєкти Інструменти Події
Інше
Про нас Реклама
Senior Filament

Як організувати велику адмінку у Filament: кластери чи кілька панелей?

Коли ресурсів і сторінок стають десятки, бічна навігація перетворюється на довгий список. Filament дає два рівні структури.

Кластери - групують ресурси й сторінки в одному пункті навігації з власною піднавігацією:

// AdminPanelProvider
$panel->discoverClusters(in: app_path('Filament/Clusters'), for: 'App\Filament\Clusters');
php artisan make:filament-cluster Settings
class SettingsCluster extends Cluster
{
    protected static string|BackedEnum|null $navigationIcon = Heroicon::OutlinedCog6Tooth;
    protected static ?SubNavigationPosition $subNavigationPosition = SubNavigationPosition::Top;
}

// у ресурсі чи сторінці
protected static ?string $cluster = SettingsCluster::class;
  • у головній навігації - один пункт «Налаштування», а всередині - вкладки чи бічне меню з ресурсами кластера;
  • URL і назви маршрутів отримують префікс кластера (/admin/settings/currencies);
  • кластер видно в навігації лише тоді, коли користувач має доступ хоча б до одного його компонента, а відкриття самого кластера переводить на перший доступний.

Кілька панелей - окремі «застосунки» всередині одного Laravel:

php artisan make:filament-panel partner
return $panel
    ->id('partner')
    ->path('partner')
    ->authGuard('partner')
    ->discoverResources(in: app_path('Filament/Partner/Resources'), for: 'App\Filament\Partner\Resources');

Кожна панель має свій шлях, свій набір ресурсів, власну тему, навігацію, middleware і навіть гард автентифікації.

Що обрати:

Ситуація Рішення
одна аудиторія, багато розділів кластери (і групи навігації)
різні аудиторії: адміністратори, партнери, клієнти окремі панелі
різні моделі користувачів чи способи входу окремі панелі з різними гардами
однакові дані з різними правами одна панель + політики, або панелі з різними ресурсами для однієї моделі

Доступ до панелей - найважливіше місце. Модель користувача реалізує FilamentUser:

public function canAccessPanel(Panel $panel): bool
{
    return match ($panel->getId()) {
        'admin' => $this->is_admin,
        'partner' => $this->partner_id !== null,
        default => false,
    };
}

Без цієї перевірки на продакшені будь-який зареєстрований користувач потрапить у будь-яку панель (локально Filament пускає всіх - звідси класична пастка).

Ризики:

  • панель не ізолює дані: ресурс партнерської панелі все одно має обмежувати запит своїми записами (глобальна область видимості, modifyQueryUsing, мультиорендність Filament), інакше зміна ID в адресі покаже чужий запис;
  • дублювання ресурсів для різних панелей - виносьте спільні форми й таблиці в окремі класи схем;
  • кластери й панелі не замінюють політики - вони керують навігацією, а не правами на дії.

Докладніше в документації: Filament: кластери

Перевір себе

20 випадкових питань за спробу, після завершення - розбір кожної помилки

Схожі питання