PHP Attributes in Laravel 13: addio alle property sparse nei modelli — articolo

> PHP Attributes in Laravel 13: addio alle property sparse nei modelli

Come i PHP Attributes nativi cambiano il modo di dichiarare table, fillable, hidden e casts nei modelli Eloquent.

Luigi Iadicola
~5 min lettura
#Laravel #PHP #Eloquent
PHP Attributes in Laravel 13: addio alle property sparse nei modelli
PHP Attributes in Laravel 13: addio alle property sparse nei modelli

Il problema delle property sparse nei modelli Eloquent

Fino a Laravel 12, configurare un modello Eloquent significava definire proprieta come $table, $fillable, $hidden, $casts e $primaryKey sparse nel corpo della classe. Con modelli complessi — quelli con decine di campi, relazioni multiple e accessor personalizzati — queste dichiarazioni si mescolano a relazioni e metodi, rendendo il codice meno leggibile e piu difficile da navigare.

Il problema e particolarmente evidente nei progetti di grandi dimensioni. Quando un modello supera le 200 righe, trovare rapidamente quali campi sono fillable o quali cast sono applicati richiede di scorrere tutto il file. Per chi lavora come freelance PHP su progetti di clienti diversi, questa dispersione delle informazioni rallenta l'onboarding e aumenta il rischio di errori.

La soluzione: PHP Attributes nativi in Laravel 13

Laravel 13 introduce i PHP Attributes nativi come alternativa opzionale alle proprieta tradizionali. Tutte le configurazioni del modello possono essere dichiarate in modo compatto sopra la classe, usando la sintassi nativa di PHP 8.1+ che fino ad ora il framework non sfruttava appieno.

La differenza e immediata: aprendo un file modello, le prime righe dopo la dichiarazione della classe comunicano immediatamente cosa fa quel modello, senza dover scorrere il codice alla ricerca delle proprieta.

Sintassi a confronto: prima e dopo

Ecco come cambia la dichiarazione di un modello tipico:

  • #[Table('users')] al posto di protected $table = 'users' — la tabella di riferimento e dichiarata come attributo della classe
  • #[Fillable(['name', 'email', 'password'])] al posto di protected $fillable = [...] — i campi compilabili in mass assignment
  • #[Hidden(['password', 'remember_token'])] per nascondere campi dalla serializzazione JSON
  • #[Cast('email_verified_at', 'datetime')] per definire i cast dei campi del database
  • #[PrimaryKey('uuid')] per modelli con chiave primaria personalizzata

Dove si applicano gli Attributes in Laravel 13

Gli Attributes non sono limitati ai modelli Eloquent. Laravel 13 li supporta in oltre 15 punti del framework:

  • Controller: middleware, prefissi di rotta e gruppi definiti come attributi della classe
  • Job: connessione, coda, tentativi e timeout dichiarati sopra la classe
  • Comandi Artisan: signature e description come attributi nativi
  • Listener: evento ascoltato e coda di esecuzione
  • Mailable: subject, from e queue configuration
  • Notification: canali e configurazione di delivery

In ogni caso, la vecchia sintassi a proprieta resta supportata al 100%. Non c'e nessun obbligo di migrare: si puo adottare gradualmente, partendo dai modelli nuovi e convertendo quelli esistenti quando ha senso.

Vantaggi concreti per lo sviluppo quotidiano

Leggibilita migliorata

Con gli Attributes, aprire un modello e capire la sua configurazione richiede un colpo d'occhio. Le informazioni strutturali — tabella, fillable, hidden, casts — sono raggruppate in cima al file, separate dalla logica di business come relazioni, scope e accessor. Questo e particolarmente utile durante le code review e il pair programming.

Meno errori di configurazione

La sintassi degli Attributes e piu restrittiva rispetto alle proprieta PHP classiche. Un errore di battitura nel nome dell'attributo viene intercettato dall'IDE o dallo static analysis tool prima ancora di eseguire il codice. Con le proprieta tradizionali, una $tabel al posto di $table non genera errori — semplicemente non funziona.

Coerenza tra componenti

Usare la stessa sintassi per modelli, controller, job e notification crea una coerenza stilistica che rende il codice piu prevedibile. Quando ogni componente del framework adotta lo stesso pattern dichiarativo, lo sviluppatore sa sempre dove trovare le informazioni di configurazione.

Considerazioni sulle performance

Una domanda legittima: gli Attributes hanno un impatto sulle performance? La risposta e no, per un motivo tecnico preciso. Laravel legge gli Attributes una sola volta al boot del modello e li mette in cache. In produzione, con la route cache e la config cache attive, il costo aggiuntivo e trascurabile — nell'ordine dei microsecondi.

In fase di sviluppo locale, dove la cache non e attiva, l'overhead della reflection e comunque minimo e non percepibile nella pratica quotidiana.

Come migrare i modelli esistenti

La migrazione e semplice e puo essere fatta in modo incrementale:

  • Scegliere un modello di partenza, preferibilmente uno piccolo e ben testato
  • Sostituire le proprieta con gli Attributes corrispondenti
  • Eseguire la test suite per verificare che il comportamento sia identico
  • Procedere con i modelli successivi, uno alla volta

Non c'e fretta di convertire tutto: i modelli con Attributes e quelli con proprieta tradizionali convivono senza problemi nello stesso progetto. La regola pratica e: modelli nuovi con Attributes, modelli esistenti convertiti quando li si tocca per altri motivi.

Supporto IDE e tooling

PhpStorm e VS Code con l'estensione PHP Intelephense riconoscono gia gli Attributes di Laravel 13. L'autocompletamento funziona, la navigazione ai sorgenti e supportata e gli errori di sintassi vengono evidenziati in tempo reale. Anche PHPStan e Larastan supportano l'analisi statica degli Attributes, garantendo lo stesso livello di sicurezza delle proprieta tradizionali.

Il contesto piu ampio: PHP verso un linguaggio dichiarativo

L'adozione degli Attributes in Laravel 13 non e un caso isolato. PHP come linguaggio si sta muovendo verso uno stile piu dichiarativo: le enum introdotte in PHP 8.1, i tipi readonly, le classi readonly di PHP 8.2, e ora l'uso massiccio degli Attributes nei framework principali. Symfony li usa gia da tempo per le rotte e la dependency injection; ora anche Laravel li abbraccia pienamente.

Per chi sviluppa in PHP professionalmente, adottare gli Attributes non e solo una questione di sintassi: e allinearsi alla direzione in cui il linguaggio e l'ecosistema si stanno muovendo.

altri articoli
progetti correlati