Панель у Filament - окрема адмінка зі своїм адресом, входом, навігацією й оформленням. Кожну описує клас-провайдер, який створює php artisan filament:install --panels (наприклад, app/Providers/Filament/AdminPanelProvider.php):
public function panel(Panel $panel): Panel
{
return $panel
->default()
->id('admin')
->path('admin')
->login()
->passwordReset()
->emailVerification()
->profile()
->colors(['primary' => Color::Indigo])
->brandName('Laravel Ukraine')
->discoverResources(in: app_path('Filament/Resources'), for: 'App\Filament\Resources')
->discoverPages(in: app_path('Filament/Pages'), for: 'App\Filament\Pages')
->middleware([/* стек web: сесія, CSRF, ... */])
->authMiddleware([Authenticate::class]);
}
Що тут задається:
| Метод | Що робить |
|---|---|
id() |
ідентифікатор панелі - потрібен, коли панелей кілька |
path() / domain() |
адреса: /admin чи окремий піддомен |
login(), registration(), passwordReset(), emailVerification(), profile() |
вбудовані сторінки автентифікації - вмикаються лише явно |
colors(), brandName(), brandLogo(), favicon() |
оформлення |
discoverResources() / resources([...]) |
які ресурси, сторінки й віджети підключити |
middleware() / authMiddleware() |
стек для всіх сторінок і для захищених |
spa(), topNavigation(), databaseNotifications() |
режим навігації без перезавантаження, верхнє меню, сповіщення |
registration() - обережно: публічна реєстрація в адмінку майже ніколи не потрібна. Без неї користувачів створюють сидером, командою make:filament-user чи з самої панелі.
Хто може зайти - вирішує не провайдер, а модель користувача. На продакшені Filament пускає лише тих, для кого canAccessPanel() повертає true:
class User extends Authenticatable implements FilamentUser
{
public function canAccessPanel(Panel $panel): bool
{
return $panel->getId() === 'admin' && $this->is_admin;
}
}
Без інтерфейсу FilamentUser локально заходить будь-хто з акаунтом, а на продакшені - ніхто (403).
Кілька панелей - кілька провайдерів з різними id() і path(): адмінка для команди й кабінет для клієнтів, кожна зі своїми ресурсами, authGuard() і правилами входу.
Типові помилки: провайдер не зареєстровано в bootstrap/providers.php (панель просто не відкривається), змішування ресурсів двох панелей через спільний каталог для discoverResources(), і забута перевірка в canAccessPanel() для другої панелі.