Qu’est-ce que le trait Macroable
Le traitMacroable permet d’ajouter dynamiquement des méthodes à une classe après coup, sans la modifier. Beaucoup de classes du cœur de Laravel l’utilisent, ce qui vous permet d’étendre les fonctionnalités sans toucher au code du cœur.
L’implémentation réside dans Illuminate\Support\Traits\Macroable. En interne, les macros enregistrées sont stockées dans la propriété statique $macros, et sont invoquées via les méthodes magiques __call / __callStatic.
Classes utilisant Macroable
Laravel comporte de nombreuses classes compatibles Macroable.macro() — ajouter une méthode
Passez le nom de la méthode en premier argument et une closure en second àmacro().
$this de la closure est lié à l’instance qui a appelé la macro. Vous pouvez ainsi accéder directement aux propriétés et méthodes de la classe.
mixin() — ajouter plusieurs méthodes d’un coup
Pour enregistrer beaucoup de macros à la fois, utilisezmixin(). Toutes les méthodes public / protected de la classe de mixin sont enregistrées comme macros.
Les méthodes de
mixin() doivent renvoyer la closure à enregistrer comme macro. C’est la valeur de retour de la méthode qui devient l’implémentation de la macro.Enregistrement dans un service provider
Les macros doivent être enregistrées au démarrage de l’application. La méthodeboot() d’AppServiceProvider est l’endroit approprié.
Cas d’utilisation pratiques
Étendre les collections
Ajouter des méthodes personnalisées aux collections est l’usage le plus courant.Étendre la classe Str
Étendre la classe Request
Étendre Blueprint (migrations)
Regrouper des définitions de colonnes sous forme de macros permet de garder une conception de base de données cohérente.Étendre les réponses de test
Vous pouvez ajouter des méthodes d’assertion propres aux tests.hasMacro() — vérifier l’existence d’une macro
flushMacros() — réinitialiser les macros
À utiliser pour réinitialiser les macros dans les tests.Macros statiques
Les macros fonctionnent aussi bien comme méthodes d’instance que comme méthodes statiques. C’est__callStatic qui les gère.
Utiliser le trait Macroable dans vos propres classes
Vous pouvez également intégrerMacroable à vos classes.
Détails de l’implémentation interne
Closure::bindTo(). Ainsi, $this pointe vers l’objet appelant. Pour d’autres types (objets invokables, par exemple), aucune liaison n’est effectuée.
Étapes suivantes
Pattern Pipeline
Découvrez comment enchaîner en série plusieurs étapes de traitement grâce au pattern pipeline.