Filament в Laravel: подключаем админку на живом проекте
Разбираем, как поставить Filament на существующий проект Laravel 11: где он выигрывает у самописной админки, чем платит за скорость и на чём спотыкается на реальных данных.

Задача: админка нужна вчера, а моделей уже два десятка
У вас проект на Laravel 11, в базе полтора десятка таблиц — пользователи, заказы, товары, категории. Заказчик хочет, чтобы контент-менеджер сам заводил товары и менял статусы заказов, без обращения к разработчику. Писать CRUD-контроллеры, формы, валидацию и таблицы с пагинацией руками — это неделя работы на каждую сущность и вечный источник багов в верстке.
Очевидное решение — взять готовую админ-панель. Но тут развилка: Laravel Nova (платная, от Laravel), Filament (бесплатная, на TALL-стеке) и Backpack (частично платный). Разберём подключение Filament на живом проекте — он сейчас самый популярный из бесплатных, и покажем, где он экономит дни, а где заставит писать больше кода, чем при самописном варианте.
Всё ниже — для Filament 3.x и Laravel 11.x. В Filament 3 многое поменялось относительно версии 2: изменились неймспейсы, структура ресурсов и способ регистрации панели. Если гуглите примеры и видите Filament\Resources\Resource без панели — это код от второй версии, он не заведётся.
Что должно быть до старта
- Laravel 11.x, PHP 8.2 или выше — Filament 3 требует минимум 8.1, но Laravel 11 сам хочет 8.2;
- установленный и настроенный
composer, доступ кphp artisan; - работающее подключение к базе и уже прогнанные миграции — Filament строит формы вокруг существующих моделей;
- Node и npm, если планируете кастомизировать тему; для базовой установки они не обязательны — Filament везёт скомпилированные ассеты.
Ставим Filament и создаём панель
Установка идёт через Composer, затем отдельная команда разворачивает панель администратора.
# Filament 3.x, Laravel 11.x
composer require filament/filament:"^3.2"
# создаём панель с идентификатором admin
php artisan filament:install --panelsКоманда filament:install --panels создаёт провайдер app/Providers/Filament/AdminPanelProvider.php и регистрирует его. Панель по умолчанию доступна по адресу /admin. Проверка: откройте в браузере http://ваш-сайт/admin — должна появиться страница входа Filament, а не ошибка 404.
Создаём пользователя админки
Filament использует стандартную модель App\Models\User. Чтобы войти, нужен пользователь. Есть готовая команда:
php artisan make:filament-userОна спросит имя, email и пароль. После этого можно залогиниться на /admin. Проверка: после входа откроется дашборд Filament с пустым меню — ресурсов вы ещё не создали.
Filament пустит в панель любого пользователя из таблицы users. На проде это дыра: контроль доступа надо включать явно через метод canAccessPanel — иначе любой зарегистрированный клиент вашего магазина попадёт в админку.
Ограничиваем доступ
Модель User должна реализовать интерфейс FilamentUser и метод, который решает, кого пускать. Иначе в панель попадёт каждый, кто прошёл аутентификацию.
use Filament\Models\Contracts\FilamentUser;
use Filament\Panel;
class User extends Authenticatable implements FilamentUser
{
// пускаем только пользователей с флагом is_admin
public function canAccessPanel(Panel $panel): bool
{
return (bool) $this->is_admin;
}
}Поле is_admin должно существовать в таблице — добавьте его миграцией, если его нет. Проверка: пользователь без флага при заходе на /admin получит редирект на страницу входа, а не дашборд.
Генерируем ресурс под существующую модель
Ресурс в Filament — это класс, который описывает таблицу, форму и права для одной модели. Сгенерируем ресурс для модели Product:
# --generate заполнит форму и таблицу по колонкам БД
php artisan make:filament-resource Product --generateФлаг --generate просканирует таблицу products и сам расставит поля формы и колонки таблицы по типам столбцов. Это черновик, а не финал: он не угадает, что status — это перечисление, а category_id должно быть выпадающим списком со связью. Отредактируйте сгенерированный файл app/Filament/Resources/ProductResource.php.
use Filament\Forms\Components\TextInput;
use Filament\Forms\Components\Select;
use Filament\Forms\Form;
use Filament\Tables\Columns\TextColumn;
use Filament\Tables\Table;
public static function form(Form $form): Form
{
return $form->schema([
TextInput::make('title')->required()->maxLength(255),
// связь с категорией через отношение category()
Select::make('category_id')
->relationship('category', 'name')
->searchable()
->required(),
Select::make('status')->options([
'draft' => 'Черновик',
'published' => 'Опубликован',
])->required(),
TextInput::make('price')->numeric()->prefix('руб'),
]);
}
public static function table(Table $table): Table
{
return $table->columns([
TextColumn::make('title')->searchable()->sortable(),
TextColumn::make('category.name')->label('Категория'),
TextColumn::make('price')->money('RUB')->sortable(),
TextColumn::make('status')->badge(),
]);
}Метод relationship('category', 'name') предполагает, что в модели Product есть отношение category(). Если его нет — получите ошибку о неопределённом методе. Проверка: обновите /admin, в левом меню появится пункт Products, а внутри — таблица с товарами и кнопкой создания.
Nova, Filament и Backpack: чем платите за скорость
Filament выигрывает в скорости старта, но у каждого варианта своя цена. Она измеряется в деньгах, в привязке к стеку и в потолке кастомизации.
| Критерий | Filament 3 | Laravel Nova 4 | Backpack |
|---|---|---|---|
| Цена | Бесплатно, MIT | Платная лицензия за проект | Ядро бесплатно, PRO-инструменты платные |
| Стек фронтенда | Livewire + Alpine + Tailwind | Vue | Blade + собственные виджеты |
| Кастомные страницы | Легко, свои Livewire-компоненты | Через Vue-компоненты, порог выше | Через Blade, гибко |
| Порог входа | Низкий, если знаете Blade | Средний, нужен Vue | Низкий |
Если ваша команда живёт в экосистеме Livewire — Filament ложится идеально. Если фронтенд у вас на Vue и есть бюджет — Nova даст более привычный инструментарий. Backpack — компромисс для тех, кто хочет остаться в чистом Blade без Livewire.
Если не получилось
- 404 на /admin после установки — не выполнена
filament:install --panelsили провайдер панели не зарегистрирован. Проверьте, чтоAdminPanelProviderесть вbootstrap/providers.php. - «These credentials do not match our records» при верном пароле — вы вошли, но
canAccessPanelвернул false. Проверьте флагis_adminу пользователя в базе. - «Call to undefined method category()» — в
Select::make(...)->relationship('category')указано отношение, которого нет в модели. Опишите методcategory()в моделиProduct. - Стили не подгрузились, панель без вёрстки — не опубликованы или не собраны ассеты. Выполните
php artisan filament:assetsи обновите кэш браузера. - Пустой Select у связи — таблица категорий пуста либо указано не то поле для отображения. Второй аргумент
relationshipдолжен быть существующей колонкой.
Что делать дальше
Базовая админка на Filament поднимается за час. Следующие шаги, которые почти всегда нужны на реальном проекте:
- роли и права — подключите пакет прав доступа и разграничьте, кто какие ресурсы видит, вместо одного флага
is_admin; - валидация форм под бизнес-правила: методы
rules()и правила на уровне полей, а не толькоrequired(); - фильтры и массовые действия в таблицах — смотрите раздел Tables в документации Filament;
- на проде проверьте, что панель закрыта: любой заход на
/adminбез прав должен упираться в редирект.
Кастомизация темы и русификация интерфейса — отдельная тема, здесь мы разобрали только подключение и первый рабочий ресурс.
Репетитор 1—11 класс и ВУЗ: Математика и физика методом наведения на мысль, помощь с ДЗ.
Спросить за 8 ₽Источники: Filament — официальная документация (Panels), Laravel 11 — документация
Частые вопросы
У меня Filament 2, примеры не работают. В чём разница?
Filament работает без Vue и сборки фронтенда?
Можно ли подключить Filament к проекту, где базой заведует не Eloquent?
Что будет, если я не настрою canAccessPanel на проде?
Флаг --generate заменяет ручную настройку ресурса?
Filament сильно тормозит на больших таблицах?
Материал носит информационный характер и подготовлен редакцией «Агентуры». Он не является офертой, рекламой или индивидуальной консультацией. Упомянутые продукты, компании и торговые знаки принадлежат их правообладателям. Перед принятием решений, влекущих юридические или финансовые последствия, обратитесь к профильному специалисту.