Que sont les attributs PHP
Les attributs PHP (PHP Attributes) sont une syntaxe native de métadonnées introduite avec PHP 8.0. Ils permettent de rattacher des méta-informations à des classes, méthodes, propriétés ou fonctions sous la forme#[AttributeName].
Laravel les adopte activement dans son cœur : la configuration des jobs et des modèles Eloquent peut être écrite de manière déclarative. Depuis Laravel 13 (v13.2.0), les attributs de queue acceptent les enum. À la place des propriétés de classe et des surcharges de méthodes traditionnelles, on peut écrire un code plus lisible et concis avec des attributs.
Attributs liés aux queues
Tous les attributs relatifs aux jobs de queue résident dans le namespaceIlluminate\Queue\Attributes.
#[Queue] — spécifier le nom de queue
Indique la queue par défaut dans laquelle le job sera envoyé.
L’attribut
#[Queue] est déclaré avec la cible Attribute::TARGET_CLASS, il ne peut donc s’appliquer qu’à une classe.#[Connection] — spécifier la connexion
Indique la connexion de queue par défaut utilisée par le job.
#[Backoff] — spécifier le temps d’attente entre tentatives
Indique le temps d’attente (en secondes) avant de retenter un job en échec. On peut passer plusieurs valeurs pour définir un délai différent par tentative (arguments variadiques).
Backoff reçoit des arguments variadiques.
int, plusieurs en array.
#[Tries] — spécifier le nombre de tentatives
Indique le nombre maximum de tentatives en cas d’échec du job.
#[Timeout] — spécifier un délai maximal
Indique la durée maximale d’exécution (en secondes) du job. Au-delà, le job est forcé à s’arrêter.
#[MaxExceptions] — spécifier le nombre d’exceptions tolérées
Considère le job comme échoué si plus d’un certain nombre d’exceptions surviennent. À combiner avec #[Tries].
#[UniqueFor] — spécifier la durée d’unicité
Indique la période de verrouillage (en secondes) empêchant l’exécution en double d’un job. À combiner avec ShouldBeUnique.
#[DeleteWhenMissingModels] — supprimer si les modèles n’existent plus
Si un modèle Eloquent dont dépend le job est introuvable, celui-ci est traité comme une suppression (skip) plutôt qu’un échec.
#[WithoutRelations] — exclure les relations
Exclut les relations d’un modèle lors de la sérialisation du job. Cela allège les données envoyées à la queue.
#[FailOnTimeout] — traiter le timeout comme un échec
Enregistre un job dépassant son timeout comme un échec (par défaut, le timeout ne l’est pas).
Combiner plusieurs attributs de queue
Vous pouvez combiner ces attributs pour configurer le comportement du job de façon déclarative.Attributs liés à Eloquent
Les attributs des modèles Eloquent sont dans le namespaceIlluminate\Database\Eloquent\Attributes. Laravel 13 en introduit un grand nombre.
#[ScopedBy] — spécifier un scope global
Applique automatiquement une classe de scope global au modèle via un attribut. L’héritage est pris en charge, et le flag IS_REPEATABLE permet d’indiquer plusieurs scopes.
booted().
#[ObservedBy] — spécifier un observer
Associe un observer à un modèle via un attribut. Comme ScopedBy, il est IS_REPEATABLE.
AppServiceProvider n’est plus nécessaire.
#[UseEloquentBuilder] — spécifier un query builder personnalisé
Spécifie via attribut le builder Eloquent personnalisé qu’utilise le modèle.
#[CollectedBy] — spécifier une collection personnalisée
Spécifie via attribut la classe de collection à utiliser pour les collections du modèle.
#[Table] — regrouper la configuration de table
Nom de table, clé primaire, timestamps : plusieurs paramètres de configuration liés à la table se spécifient via un unique attribut.
Table sont les suivantes.
| Paramètre | Propriété correspondante | Description |
|---|---|---|
name | $table | Nom de la table |
key | $primaryKey | Nom de la colonne clé primaire |
keyType | $keyType | Type de la clé primaire ('int', 'string', etc.) |
incrementing | $incrementing | Auto-incrémentation de la clé primaire |
timestamps | $timestamps | Active/désactive les timestamps |
dateFormat | $dateFormat | Format de date |
#[Scope] — définir une méthode comme scope local
Vous pouvez définir une méthode comme scope local Eloquent sans le préfixe scope.
#[UseFactory] — spécifier une classe factory
Spécifie via attribut la classe factory utilisée par le modèle.
Autres attributs Eloquent
| Attribut | Description |
|---|---|
#[Fillable(...$attributes)] | Colonnes autorisées en assignation en masse |
#[Guarded(...$attributes)] | Colonnes protégées de l’assignation en masse |
#[Unguarded] | Désactive la protection contre l’assignation en masse |
#[Hidden(...$attributes)] | Colonnes à exclure de la sérialisation |
#[Visible(...$attributes)] | Colonnes à inclure dans la sérialisation |
#[Appends(...$attributes)] | Accesseurs à ajouter lors de la sérialisation |
#[Touches(...$relations)] | Relations dont l’updated_at doit être mis à jour |
#[WithoutTimestamps] | Désactive les timestamps |
#[WithoutIncrementing] | Désactive l’auto-incrémentation de la clé primaire |
#[DateFormat(format: '...')] | Format de date |
#[UsePolicy(policyClass: '...')] | Classe de policy associée |
#[UseResource(resourceClass: '...')] | Classe de ressource API associée |
#[UseResourceCollection(resourceCollectionClass: '...')] | Classe de collection de ressource associée |
Prise en charge des enums (ajoutée en v13.2.0)
Depuis la v13.2.0,#[Queue] et #[Connection] acceptent les enums. Vous pouvez ainsi désigner la queue et la connexion de façon typée avec des enums PHP, au lieu de littéraux de chaîne.
Comparaison avec les propriétés de classe traditionnelles
Avantages des attributs
- Déclaratif — un regard sur le début de la classe suffit à comprendre son comportement.
- Typé — avec les enums, l’auto-complétion et la vérification de type fonctionnent.
- Compatible avec l’héritage — les attributs du parent peuvent être remplacés dans les enfants.
- Moins de code — pas besoin de déclarer des propriétés ou d’écraser des méthodes.
Inconvénients des attributs
- Pas de valeurs dynamiques — les arguments d’attributs sont des constantes de compilation. Ni variables ni valeurs de config ne peuvent y être passées.
- Nécessite une prise en main — l’équipe peut avoir besoin de temps pour s’habituer à la syntaxe d’attributs de PHP 8.
Lorsque des valeurs dynamiques sont nécessaires
Pour décider d’une valeur à l’exécution, utilisez la surcharge de méthode classique.Fonctionnement interne
Laravel utilise en interne l’API Reflection pour lire les attributs. Lorsqu’un worker de queue dispatche un job, le traitReadsQueueAttributes (inclus dans InteractsWithQueue) détecte les attributs par réflexion et positionne les valeurs sur les propriétés correspondantes.
Model::booted().
Étapes suivantes
Niveau intermédiaire : queues et jobs
Découvrez les bases du système de queue Laravel.
API PHP Reflection
Découvrez en détail l’API Reflection utilisée par Laravel pour lire les attributs.