Skip to main content

Cosa sono gli attributi PHP

Gli attributi PHP sono una sintassi nativa di metadati introdotta con PHP 8.0. Permettono di applicare meta-informazioni a classi, metodi, proprietà, funzioni ecc. nella forma #[AttributeName]. Laravel adotta attivamente gli attributi PHP nel framework, e ti permette di configurare in modo dichiarativo job e modelli Eloquent. In Laravel 13 (v13.2.0) gli attributi per le queue accettano enum. Al posto delle proprietà di classe o degli override di metodi puoi scrivere codice più leggibile e conciso.
Gli attributi sono disponibili da PHP 8.0. Laravel 13 richiede PHP 8.3 o superiore, quindi puoi usare gli attributi in tutti gli ambienti.

Attributi per le code

Gli attributi relativi ai job in coda si trovano tutti nel namespace Illuminate\Queue\Attributes.

#[Queue] — indicare il nome della coda

Indica il nome della coda di default in cui il job viene inviato.
Da v13.2.0 puoi passare anche un enum al posto della stringa.
L’attributo #[Queue] è impostato con target Attribute::TARGET_CLASS, quindi è applicabile solo alle classi.

#[Connection] — indicare la connessione

Indica la connection di coda di default usata dal job.
Anche qui puoi usare un enum.

#[Backoff] — tempo di backoff per i retry

Indica il tempo di attesa (in secondi) prima di ritentare quando il job fallisce. Passando più valori puoi impostare un tempo diverso per ogni retry (supporta argomenti variadic).
Guardando l’implementazione della classe Backoff è progettata per ricevere argomenti variadic.
Un singolo valore viene memorizzato come int, più valori come array.

#[Tries] — numero di retry

Indica il numero massimo di retry quando il job fallisce.

#[Timeout] — timeout

Indica il tempo massimo di esecuzione del job (in secondi). Superata questa soglia il job viene terminato forzatamente.

#[MaxExceptions] — numero massimo di eccezioni tollerate

Se avvengono più eccezioni del numero indicato, il job viene considerato fallito. Da combinare con #[Tries].

#[UniqueFor] — periodo di unicità

Indica il periodo di lock (in secondi) per evitare esecuzioni duplicate. Da usare con ShouldBeUnique.

#[DeleteWhenMissingModels] — cancella se il modello non esiste

Se un modello Eloquent da cui dipende il job non viene trovato, il job viene cancellato (saltato) anziché fallito.

#[WithoutRelations] — escludere le relation

Fa in modo che, al momento della serializzazione, le relation del modello non vengano incluse. Alleggerisce i dati inviati in coda.

#[FailOnTimeout] — timeout come fallimento

Registra il job come fallito quando avviene un timeout (di default il timeout non viene registrato come fallimento).

Combinare più attributi delle code

Combinando questi attributi configuri in modo dichiarativo il comportamento del job.

Attributi per Eloquent

Gli attributi per i modelli Eloquent si trovano nel namespace Illuminate\Database\Eloquent\Attributes. In Laravel 13 ne sono stati aggiunti molti.

#[ScopedBy] — indicare un global scope

Indica con un attributo la classe di global scope da applicare automaticamente al modello. Supporta l’ereditarietà; con il flag IS_REPEATABLE puoi indicare più scope.
Per più scope puoi ripetere l’attributo o passare un array.
Confronto con il metodo booted() tradizionale.

#[ObservedBy] — indicare un observer

Indica con un attributo la classe observer associata al modello. Come ScopedBy, è IS_REPEATABLE.
Puoi indicare più observer.
Non serve più la registrazione in AppServiceProvider.

#[UseEloquentBuilder] — indicare un query builder custom

Indica con un attributo l’Eloquent builder personalizzato usato dal modello.

#[CollectedBy] — indicare una collection custom

Indica con un attributo la classe di collection personalizzata usata per il modello.

#[Table] — configurazione tabella in un attributo

Puoi indicare in un unico attributo più impostazioni della tabella: nome, primary key, timestamps.
Opzioni configurabili con l’attributo Table:

#[Scope] — definire un metodo come local scope

Puoi definire un metodo come local scope Eloquent senza prefisso scope.

#[UseFactory] — indicare la classe factory

Indica con un attributo la classe factory personalizzata del modello.

Altri attributi Eloquent

Supporto agli enum (aggiunto in v13.2.0)

In v13.2.0 #[Queue] e #[Connection] accettano enum. Al posto delle stringhe letterali puoi indicare queue e connection in modo type-safe con enum PHP.
Con gli enum eviti errori di battitura in nomi di code e connection e sfrutti l’autocompletamento dell’IDE. È utile per gestire in modo centralizzato nomi di coda e connection nell’intera applicazione.

Confronto con le proprietà di classe tradizionali

Vantaggi degli attributi

  • Dichiarativi — guardando l’inizio della classe capisci a colpo d’occhio il comportamento del job
  • Type-safe — con gli enum ottieni autocompletamento e type check dell’IDE
  • Buoni con l’ereditarietà — puoi sovrascrivere in una classe figlia gli attributi della classe padre
  • Meno codice — niente dichiarazioni di proprietà o override di metodi

Svantaggi

  • Non puoi impostare valori dinamici — gli argomenti degli attributi sono solo costanti a compile time: variabili o valori di config non funzionano
  • Serve familiarità — a volte il team ha bisogno di prendere confidenza con la sintassi degli attributi PHP 8

Se ti servono valori dinamici

Se vuoi decidere i valori a runtime, usa il tradizionale override di metodo.
Gli attributi vengono analizzati al momento della compilazione di PHP. Non puoi usare valori a runtime come config() o env(). Se ti servono impostazioni dinamiche, continua a usare proprietà o metodi di classe.

Meccanismo di implementazione

Internamente Laravel usa la Reflection API per leggere gli attributi. Quando il queue worker fa dispatch del job, il trait ReadsQueueAttributes (incluso in InteractsWithQueue) individua gli attributi via reflection e imposta i valori sulle proprietà corrispondenti.
Anche gli attributi dei modelli Eloquent vengono letti in modo analogo, al momento equivalente a Model::booted().

Prossimi passi

Intermedio: code e job

Impara l’uso di base del sistema code di Laravel.

PHP Reflection API

Approfondisci il meccanismo della Reflection API usata da Laravel per leggere gli attributi.
Ultima modifica il 13 luglio 2026