Коли ресурсів і сторінок стають десятки, бічна навігація перетворюється на довгий список. 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 в адресі покаже чужий запис; - дублювання ресурсів для різних панелей - виносьте спільні форми й таблиці в окремі класи схем;
- кластери й панелі не замінюють політики - вони керують навігацією, а не правами на дії.