Разработка административной панели на Filament (Laravel)
Filament — современный фреймворк для построения admin-панелей на Laravel. Использует Livewire и Alpine.js для реактивных компонентов без написания JavaScript. В 2025 году — де-факто стандарт для Laravel-проектов, которым нужна быстро написанная, но гибко настраиваемая панель.
Установка
composer require filament/filament:"^3.0"
php artisan filament:install --panels
php artisan make:filament-user
Создание ресурса
php artisan make:filament-resource Order --generate
Это создаёт OrderResource со стандартными CRUD-операциями. Кастомизация:
class OrderResource extends Resource
{
protected static ?string $model = Order::class;
protected static ?string $navigationIcon = 'heroicon-o-shopping-cart';
protected static ?string $navigationGroup = 'Продажи';
public static function form(Form $form): Form
{
return $form->schema([
Select::make('status')
->options(OrderStatus::class)
->required(),
TextInput::make('total')
->numeric()->prefix('₽')->disabled(),
Select::make('customer_id')
->relationship('customer', 'name')
->searchable()->preload(),
Repeater::make('items')
->relationship()
->schema([
Select::make('product_id')->relationship('product', 'name')->searchable(),
TextInput::make('quantity')->numeric()->minValue(1),
TextInput::make('price')->numeric()->prefix('₽')
])
]);
}
public static function table(Table $table): Table
{
return $table
->columns([
TextColumn::make('id')->sortable(),
TextColumn::make('customer.name')->searchable(),
BadgeColumn::make('status')
->colors(['warning' => 'pending', 'success' => 'completed', 'danger' => 'cancelled']),
TextColumn::make('total')->money('RUB')->sortable(),
TextColumn::make('created_at')->dateTime()->sortable()
])
->filters([
SelectFilter::make('status')->options(OrderStatus::class),
Filter::make('created_at')
->form([DatePicker::make('from'), DatePicker::make('until')])
->query(fn($query, $data) =>
$query->when($data['from'], fn($q, $d) => $q->whereDate('created_at', '>=', $d))
->when($data['until'], fn($q, $d) => $q->whereDate('created_at', '<=', $d))
)
])
->actions([
Tables\Actions\EditAction::make(),
Action::make('complete')
->icon('heroicon-o-check')
->color('success')
->requiresConfirmation()
->action(fn(Order $record) => $record->markAsCompleted())
->visible(fn(Order $record) => $record->status === 'pending')
])
->bulkActions([
BulkAction::make('export')
->icon('heroicon-o-arrow-down-tray')
->action(fn($records) => ExportOrders::run($records))
]);
}
}
Виджеты и дашборд
class RevenueWidget extends StatsOverviewWidget
{
protected function getStats(): array
{
return [
Stat::make('Выручка сегодня', '₽' . number_format(Order::today()->sum('total') / 100, 0, '.', ' '))
->description('+12% к прошлой неделе')
->descriptionIcon('heroicon-m-arrow-trending-up')
->color('success'),
Stat::make('Новых заказов', Order::today()->count()),
Stat::make('Средний чек', '₽' . number_format(Order::today()->avg('total') / 100, 0, '.', ' ')),
];
}
}
Кастомные страницы
// Кастомная страница аналитики
class AnalyticsPage extends Page
{
protected static string $view = 'filament.pages.analytics';
protected static ?string $navigationLabel = 'Аналитика';
protected static ?string $navigationIcon = 'heroicon-o-chart-bar';
public function getViewData(): array
{
return [
'revenueByDay' => Order::revenueByDay(30),
'topProducts' => Product::topSelling(10)
];
}
}
Права доступа через Policies
public static function canCreate(): bool
{
return auth()->user()->can('create', static::getModel());
}
public static function canEdit(Model $record): bool
{
return auth()->user()->can('update', $record);
}
Multi-tenancy
Filament 3 поддерживает мультитенантность из коробки через концепцию Tenant:
class OrderResource extends Resource
{
public static function getEloquentQuery(): Builder
{
return parent::getEloquentQuery()
->whereBelongsTo(Filament::getTenant());
}
}
Срок разработки: 2–4 недели для панели с 5–10 ресурсами, кастомными виджетами и настроенными правами.







