Skip to main content

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.
Les attributs sont disponibles à partir de PHP 8.0. Comme Laravel 13 requiert PHP 8.3 ou plus, vous pouvez les utiliser dans tous les environnements.

Attributs liés aux queues

Tous les attributs relatifs aux jobs de queue résident dans le namespace Illuminate\Queue\Attributes.

#[Queue] — spécifier le nom de queue

Indique la queue par défaut dans laquelle le job sera envoyé.
Depuis la v13.2.0, vous pouvez passer un enum à la place d’une chaîne.
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.
Ici aussi, on peut utiliser un enum.

#[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).
L’implémentation de la classe Backoff reçoit des arguments variadiques.
Une seule valeur est stockée en 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 namespace Illuminate\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.
Pour plusieurs scopes, répétez l’attribut ou passez un tableau.
Comparaison avec l’ancienne méthode booted().

#[ObservedBy] — spécifier un observer

Associe un observer à un modèle via un attribut. Comme ScopedBy, il est IS_REPEATABLE.
Vous pouvez aussi spécifier plusieurs observers.
L’enregistrement dans 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.
Les options configurables via l’attribut Table sont les suivantes.

#[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

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.
L’usage d’enums évite les fautes de frappe sur les noms de queues et de connexions, et l’auto-complétion de l’IDE est possible. Pratique pour centraliser dans toute l’application la gestion des noms de queue et de connexion.

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.
Les attributs sont analysés au moment de la compilation PHP. Vous ne pouvez pas y utiliser des valeurs runtime comme config() ou env(). Pour la configuration dynamique, continuez d’utiliser des propriétés ou des méthodes.

Fonctionnement interne

Laravel utilise en interne l’API Reflection pour lire les attributs. Lorsqu’un worker de queue dispatche un job, le trait ReadsQueueAttributes (inclus dans InteractsWithQueue) détecte les attributs par réflexion et positionne les valeurs sur les propriétés correspondantes.
Les attributs des modèles Eloquent sont lus de la même façon, au moment équivalent à 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.
Dernière modification le 13 juillet 2026