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.
Attributi per le code
Gli attributi relativi ai job in coda si trovano tutti nel namespaceIlluminate\Queue\Attributes.
#[Queue] — indicare il nome della coda
Indica il nome della coda di default in cui il job viene inviato.
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.
#[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).
Backoff è progettata per ricevere argomenti variadic.
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 namespaceIlluminate\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.
booted() tradizionale.
#[ObservedBy] — indicare un observer
Indica con un attributo la classe observer associata al modello. Come ScopedBy, è IS_REPEATABLE.
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.
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.
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.Meccanismo di implementazione
Internamente Laravel usa la Reflection API per leggere gli attributi. Quando il queue worker fa dispatch del job, il traitReadsQueueAttributes (incluso in InteractsWithQueue) individua gli attributi via reflection e imposta i valori sulle proprietà corrispondenti.
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.