⚗️ Filament 5 : le back-office Laravel qui rend les CRUD presque excitants
📚 Introduction
Construire un back-office en 2026 sans Filament, c’est volontairement compliquer sa vie. Le package est mature, l’écosystème de plugins est vaste, et la v5 sortie récemment bascule l’ensemble sur Tailwind 4 et Livewire 3 avec une amélioration sensible des perfs.
Si tu maintiens une app Laravel avec un admin custom Blade collé à coup de DataTables jQuery, ce post est pour toi. J’expose ce que Filament 5 apporte concrètement, comment ça se compare à Nova et Backpack, et pourquoi c’est désormais mon défaut sur tous mes projets clients freelance.
🚀 Install et premier panel
Pré-requis Filament 5 :
- PHP 8.2+
- Laravel 11.28+
- Tailwind CSS 4.1+
L’install panel admin se résume à deux commandes :
composer require filament/filament:"^5.0"
php artisan filament:install --panels
php artisan make:filament-userTu accèdes à ton panel sur /admin. La commande génère app/Providers/Filament/AdminPanelProvider.php que tu configures pour pointer sur tes Resources, brands, thèmes et middlewares.
Pour publier la config :
php artisan vendor:publish --tag=filament-config🧩 Resources : un CRUD = une classe
Le cœur de Filament, c’est le Resource. Une classe PHP qui décrit comment ton modèle Eloquent se présente dans le back-office. Forms, tables, infolists, actions — tout est déclaratif.
php artisan make:filament-resource Order --generateAvec --generate, Filament inspecte ton modèle et pré-remplit les Forms et Tables depuis les colonnes Doctrine. Tu modifies ensuite à la main pour affiner.
namespace App\Filament\Resources;
use App\Models\Order;
use Filament\Forms;
use Filament\Resources\Resource;
use Filament\Tables;
final class OrderResource extends Resource
{
protected static ?string $model = Order::class;
protected static ?string $navigationIcon = 'heroicon-o-shopping-cart';
public static function form(Forms\Form $form): Forms\Form
{
return $form->schema([
Forms\Components\TextInput::make('reference')
->required()
->unique(ignoreRecord: true),
Forms\Components\Select::make('customer_id')
->relationship('customer', 'name')
->searchable()
->required(),
Forms\Components\Repeater::make('items')
->relationship()
->schema([
Forms\Components\Select::make('product_id')
->relationship('product', 'name'),
Forms\Components\TextInput::make('quantity')->numeric(),
]),
]);
}
public static function table(Tables\Table $table): Tables\Table
{
return $table
->columns([
Tables\Columns\TextColumn::make('reference')->searchable(),
Tables\Columns\TextColumn::make('customer.name'),
Tables\Columns\TextColumn::make('total')->money('eur'),
Tables\Columns\TextColumn::make('created_at')->dateTime()->sortable(),
])
->filters([
Tables\Filters\SelectFilter::make('status')
->options(['pending', 'paid', 'shipped']),
]);
}
}C’est tout. Tu obtiens un CRUD complet, search, filters, pagination, validation Laravel, modals de confirmation, sans écrire un fichier Blade. Pour un freelance qui livre un back-office de gestion en 3 jours, c’est radical.
🎨 Forms et Tables réactifs
Les Forms Filament sont composables. Chaque field est une classe avec ses méthodes (->required(), ->disabled(), ->visible(fn ($get) => $get('type') === 'pro')). Tu peux faire de la réactivité côté formulaire sans toucher au JS :
Forms\Components\Select::make('country')
->options(Country::pluck('name', 'code'))
->live(),
Forms\Components\Select::make('region')
->options(fn ($get) => Region::where('country_code', $get('country'))->pluck('name', 'id'))
->visible(fn ($get) => filled($get('country'))),Le ->live() rend le champ réactif, et le Select suivant se met à jour automatiquement. Pas une ligne de JS écrite. C’est le même pattern que Symfony UX Live Components côté Symfony : le rendu reste serveur, le DX devient confortable.
🧠 Schemas : le socle commun
La v5 introduit (ou consolide) le composant filament/schemas : la base partagée par Forms, Infolists et autres builders. Concrètement, tes composants Section, Tabs, Wizard, Grid sont réutilisables entre un Form et un Infolist. Tu décris ta structure UI une fois.
use Filament\Schemas\Components\Section;
use Filament\Schemas\Components\Tabs;
public static function form(Form $form): Form
{
return $form->schema([
Tabs::make('Tabs')
->tabs([
Tabs\Tab::make('Informations générales')->schema([
Section::make('Identité')->schema([
Forms\Components\TextInput::make('first_name'),
Forms\Components\TextInput::make('last_name'),
])->columns(2),
]),
Tabs\Tab::make('Adresse')->schema([
Forms\Components\TextInput::make('street'),
Forms\Components\TextInput::make('city'),
]),
]),
]);
}🆚 Filament vs Nova vs Backpack
| Critère | Filament 5 | Nova 5 | Backpack 6 |
|---|---|---|---|
| Licence | MIT | Commerciale ($99/site) | QuickStart MIT, Pro $69 |
| Stack UI | TALL (Livewire/Alpine) | Vue 3 | Bootstrap + Blade |
| Réactivité | Native (Livewire) | Vue components | jQuery / Vue limité |
| Plugins commu. | Très large | Modérée | Modérée |
| Courbe | Faible si TALL connu | Faible si Vue connu | Très faible (Blade) |
| Tailwind 4 | Oui | Non (Tailwind 3) | Bootstrap |
Mon avis : pour 90 % des projets Laravel français en 2026, Filament 5. Nova reste pertinent si tu as une équipe Vue lourde. Backpack si tu veux du Blade pur sans Livewire. Aucun n’est mauvais ; Filament est juste le sweet spot communautaire actuel.
🔌 Écosystème plugins
L’autre raison de choisir Filament : la galaxie de plugins. Quelques-uns que j’utilise au quotidien :
- filament/spatie-laravel-permission-plugin : intégration directe avec Spatie Permissions.
- filament/spatie-laravel-media-library-plugin : upload/preview avec Media Library.
- awcodes/filament-curator : media library complète (alternative).
- bezhansalleh/filament-shield : génération auto des policies + UI permissions.
- leandrocfe/filament-apex-charts : charts ApexCharts en Widget.
- stephenjude/filament-jetstream : équivalent Jetstream/Breeze côté Filament.
Et bien sûr Lunar qui s’appuie sur Filament pour son admin e-commerce.
⚠️ Quelques précautions
- Performances : avec >100 colonnes / >5 relations sur une Resource, surveille les N+1. Utilise
->modifyQueryUsing(fn ($q) => $q->with([...])). - Tailwind 4 obligatoire : si ton app est encore en Tailwind 3, prévois la migration avant la v5. Voir Tailwind 4.
- Theming custom : tu peux totalement rebrander Filament, mais la maintenance d’un thème lourd coûte. Reste proche du défaut et compose plutôt par tokens.
- Multi-tenant : Filament gère plusieurs panels (un par tenant) via les Panel Providers. Lis la doc avant de bricoler.
🎉 Conclusion
Filament 5 confirme sa place de back-office par défaut pour Laravel. La v5 modernise la stack (Tailwind 4, Livewire 3, Schemas unifiés) sans trahir ce qui a fait le succès des versions précédentes : un DX qui rend les CRUD agréables et un écosystème de plugins riche.
Pour mes prochains projets clients, c’est le défaut sans discussion. Pour une app existante avec un admin Blade legacy, je proposerais une migration progressive : tu encapsules un premier Resource Filament, tu valides l’expérience, tu agrandis.