Skip to main content

Qu’est-ce que le trait Macroable

Le trait Macroable 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().
Le $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, utilisez mixin(). 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éthode boot() 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.
flushMacros() supprime toutes les macros de la classe. On peut l’appeler dans tearDown() pour préserver l’indépendance des tests, mais attention : les macros enregistrées par d’autres tests sont aussi supprimées.

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égrer Macroable à vos classes.

Détails de l’implémentation interne

La closure est liée à l’instance via Closure::bindTo(). Ainsi, $this pointe vers l’objet appelant. Pour d’autres types (objets invokables, par exemple), aucune liaison n’est effectuée.
Pour obtenir la prise en charge de l’IDE, vous pouvez déclarer les macros via une annotation @mixin dans un bloc doc, ou utiliser le package Laravel IdeHelper pour générer automatiquement un fichier d’aide.

Étapes suivantes

Pattern Pipeline

Découvrez comment enchaîner en série plusieurs étapes de traitement grâce au pattern pipeline.
Dernière modification le 13 juillet 2026