Il flusso di lavoro CRUD con Filament 5: dalla migration al pannello funzionante
Con Filament 5 il percorso per creare un interfaccia CRUD completa e lineare e ripetibile. Si parte dalla migration del database, si crea il model Eloquent e poi si genera la Resource con un comando Artisan. Il risultato e una pagina di listing con tabella interattiva, filtri e ricerca, piu pagine di creazione e modifica con form validato — tutto generato dal codice PHP senza toccare una riga di HTML o JavaScript.
Questo flusso non e solo veloce la prima volta: e il modo in cui si lavora costantemente con Filament. Ogni nuova entita del progetto segue lo stesso pattern, il che rende il codice prevedibile e facile da manutenere anche per chi si aggiunge al team mesi dopo.
Cosa ottieni immediatamente con una Resource Filament
Generare una Resource con php artisan make:filament-resource produce una struttura completa che include gia tutto il necessario per un CRUD professionale:
- Tabella con colonne sortabili — ogni colonna e cliccabile per ordinare i dati in modo ascendente o discendente, con indicatore visivo dell ordinamento attivo
- Ricerca globale e per campo — la barra di ricerca cerca su tutti i campi configurati come searchable, con debounce automatico per non sovraccaricare il database
- Filtri per campo — select, date range, toggle e filtri custom che si applicano in tempo reale grazie a Livewire
- Form con campi tipizzati — text input, textarea, select, date picker, file upload, rich editor, toggle, radio, checkbox group e molti altri
- Validazione integrata — usa le stesse regole di validazione di Laravel, dichiarate direttamente nel form schema
- Azioni in bulk — seleziona piu record e applica azioni come elimina, esporta o cambia stato con un click
- Soft delete e restore — con un semplice toggle nella Resource, i record eliminati vengono nascosti ma recuperabili
- Paginazione configurabile — numero di record per pagina, stile di paginazione e contatore totale
Esempio pratico: gestionale ordini da zero
Vediamo un caso concreto. Il cliente ha bisogno di un gestionale ordini con queste funzionalita: lista ordini con filtri per stato e data, dettaglio ordine con dati cliente e prodotti, modifica stato e note, export in CSV.
Step 1: migration e model
Si crea la migration con i campi necessari: customer_id, status, total, notes, created_at. Il model Order definisce le relazioni con Customer e OrderItem, i cast per i campi monetari e gli scope per i filtri.
Step 2: generare la Resource
Il comando php artisan make:filament-resource Order --generate analizza il model e genera automaticamente la Resource con form e tabella basati sui campi del database. Il flag --generate e il punto di partenza: produce codice funzionante che poi si personalizza.
Step 3: personalizzare la tabella
Nella classe OrderResource, il metodo table() definisce le colonne visibili. Si aggiungono colonne calcolate come il nome del cliente dalla relazione, badge colorati per lo stato dell ordine, formattazione monetaria per il totale e filtri per data e stato. Il tutto con metodi chainable che rendono il codice leggibile e dichiarativo.
Step 4: personalizzare il form
Il metodo form() definisce i campi di creazione e modifica. Si configura un select con ricerca per il cliente, un select per lo stato con colori associati, un campo monetario per il totale e un textarea per le note. La validazione si aggiunge inline: ->required(), ->numeric(), ->min(0).
Gestione delle relazioni nel CRUD
Uno degli aspetti piu potenti di Filament e la gestione delle relazioni Eloquent direttamente nel pannello admin. Non serve scrivere controller separati per le entita correlate: tutto si gestisce dalla Resource principale.
- BelongsTo — select con ricerca che carica i record dalla tabella correlata, con possibilita di creare nuovi record inline
- HasMany — relation manager che mostra una tabella dei record figli con CRUD completo nella stessa pagina
- BelongsToMany — gestione della tabella pivot con attach, detach e sync, con possibilita di aggiungere campi extra alla pivot
- MorphMany — supporto per relazioni polimorfiche, utili per commenti, tag e media associati a piu entita
Nel caso del gestionale ordini, la relazione HasMany con OrderItem permette di gestire le righe d ordine direttamente nella pagina dell ordine, con tabella dedicata e possibilita di aggiungere, modificare ed eliminare righe senza navigare via dalla pagina.
Il vantaggio reale: la velocita di iterazione
Il vero punto di forza del CRUD con Filament non e solo la velocita di setup iniziale — che comunque e notevole — ma la velocita con cui si risponde alle richieste di modifica del cliente.
Il cliente chiede una nuova colonna nella tabella? Una riga di codice. Un filtro aggiuntivo? Tre righe. Un campo nel form con validazione? Cinque righe. Un export CSV? Un plugin da installare e configurare in 10 minuti.
Questa velocita di iterazione cambia la dinamica del rapporto con il cliente. Invece di accumulare richieste per la prossima release, si implementano le modifiche in tempo reale durante la call. Il cliente vede il risultato subito, conferma o corregge il tiro, e si va avanti. Meno email, meno malintesi, meno ore buttate su specifiche fraintese.
Quanto codice serve davvero?
Per dare un idea concreta: un CRUD completo per una risorsa con 10 campi, relazioni, filtri e azioni richiede mediamente 80-120 righe di PHP. Lo stesso risultato costruito a mano con controller, form request, view Blade e JavaScript richiederebbe 500-800 righe distribuite su 8-10 file. Il rapporto e circa 1 a 6 in termini di codice da scrivere e manutenere.
Best practice per CRUD scalabili con Filament
Dopo diversi progetti con Filament, queste sono le pratiche che fanno la differenza sulla manutenibilita a lungo termine:
- Usare gli Enum per gli stati — invece di stringhe sparse nel codice, definire un PHP Enum per ogni campo con valori fissi. Filament supporta gli Enum nativamente nei select e nei badge
- Separare la logica pesante in Action — le operazioni complesse (invio email, calcoli, integrazioni esterne) vanno in classi Action dedicate, non inline nella Resource
- Configurare i global scope con attenzione — se il model ha global scope (es. soft delete, tenant), assicurarsi che la Resource li gestisca correttamente con i filtri appropriati
- Testare le Resource — Filament fornisce helper per i test:
assertCanSeeTableRecords,assertFormFieldExistse simili rendono i test delle Resource veloci da scrivere
Queste pratiche non sono specifiche di Filament, ma la struttura del framework le rende naturali da applicare. Il codice dichiarativo delle Resource spinge verso un design pulito, dove ogni pezzo ha il suo posto e le responsabilita sono chiare.