Vue d’ensemble
Chaque fois qu’un modèle Eloquent est instancié, il exécute deux phases : boot (une fois par classe) et initialize (une fois par instance). Lorsque vous définissez des méthodes spécifiques dans un trait, Eloquent les découvre et les appelle automatiquement. Il suffit d’ajouter le trait au modèle. Laravel lui-même utilise abondamment ce pattern dans des traits tels queSoftDeletes, HasUuids et HasUlids.
boot vs. initialize
Conventions de nommage
bootXxx()
Définissez une méthodestatic préfixée par boot suivi du nom de base de la classe du trait. Eloquent l’appelle une seule fois par cycle de vie de la classe.
initializeXxx()
Définissez une méthode d’instance préfixée parinitialize suivi du nom de base de la classe du trait. Eloquent l’appelle à chaque création d’une nouvelle instance.
PHP Attributes
Depuis Laravel 12, vous pouvez utiliser les PHP Attributes au lieu de vous appuyer sur les conventions de nommage.L’utilisation des PHP Attributes libère les noms de vos méthodes de la contrainte liée au nom du trait. Vous pouvez également définir plusieurs méthodes
#[Boot] ou #[Initialize] au sein d’un même trait.Exemples pratiques
Ajout automatique d’un global scope
Fusion de casts par défaut
Archivage automatique lors de la suppression
Exemples dans le framework
Les propres traits de Laravel illustrent clairement ce pattern :
Lire ces implémentations est une excellente façon de comprendre le pattern en profondeur.
Points d’attention
Réinitialiser les modèles bootés dans les tests
Puisqueboot* ne s’exécute qu’une seule fois par classe, les tests qui modifient le comportement des modèles peuvent nécessiter de réinitialiser le cache de boot :
Ordre d’exécution
Lorsqu’un modèle utilise plusieurs traits,bootXxx() et initializeXxx() sont appelées dans l’ordre de résolution des traits par PHP (ordre de déclaration). Soyez attentif à l’ordre lorsque les traits dépendent les uns des autres.
Résumé
Implémenter
bootXxx() et initializeXxx() dans un trait vous permet d’injecter du comportement dans n’importe quel modèle Eloquent avec une seule instruction use — le pattern incontournable pour les auteurs de packages.