DEV Community

Cover image for PHP Attributes in Laravel 13: addio alle property sparse nei modelli
Dev-Iadicola
Dev-Iadicola

Posted on Originally published at iadicola.it

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 proprietà 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 più 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 proprietà 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 proprietà.

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 proprietà resta supportata al 100%. Non c'e nessun obbligo di migrare: si può adottare gradualmente, partendo dai modelli nuovi e convertendo quelli esistenti quando ha senso.

Vantaggi concreti per lo sviluppo quotidiano

Leggibilità 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 più restrittiva rispetto alle proprietà 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 proprietà 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 più 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 può essere fatta in modo incrementale:

  • Scegliere un modello di partenza, preferibilmente uno piccolo e ben testato
  • Sostituire le proprietà 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 proprietà 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 già 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 proprietà tradizionali.

Il contesto più 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 più 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 già 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.


👉 Leggi l'articolo completo su iadicola.it

Top comments (0)