Skip to main content

Qu’est-ce que le pattern pipeline

Le pattern pipeline fait circuler un objet à traiter (passable) au travers d’une série de pipes (étapes de traitement). Chaque pipe reçoit la sortie de l’étape précédente, y ajoute son traitement et passe le résultat au pipe suivant. Dans Laravel, la classe Illuminate\Pipeline\Pipeline implémente ce pattern. Le traitement des middlewares fonctionne exactement de cette manière.

Utilisations dans le cœur de Laravel

Le pipeline est largement utilisé au cœur de Laravel.
  • Middleware HTTPIlluminate\Foundation\Http\Kernel fait passer la requête dans un pipeline de middlewares.
  • Commandes de console — pré/post-traitement des commandes Artisan.
  • Middlewares du Router — application des middlewares d’un groupe de routes.
Regardons comment le kernel HTTP utilise un pipeline.

Utilisation de base

send / through / thenReturn

C’est la forme la plus simple.
  • send($passable) — spécifie l’objet à faire passer dans le pipeline.
  • through($pipes) — spécifie le tableau de pipes.
  • thenReturn() — exécute le pipeline et retourne le résultat.

then

Pour spécifier le traitement final via une closure, utilisez then().

pipe

Pour ajouter un pipe après coup, utilisez pipe().

Pipes basés sur des classes

En utilisant des classes dédiées à la place de closures, la réutilisabilité augmente. Chaque classe implémente une méthode handle.

via — changer la méthode appelée

Par défaut, la méthode handle du pipe est invoquée, mais via() permet d’utiliser un autre nom de méthode.

Passer des paramètres aux pipes

Vous pouvez passer des paramètres à un pipe en utilisant : et , dans le nom de classe. C’est le même mécanisme que la syntaxe throttle:60,1 des middlewares.

finally — traitement après le pipeline

finally() permet d’enregistrer un callback exécuté systématiquement après le pipeline, qu’il ait réussi ou échoué.

withinTransaction — exécution dans une transaction

Depuis Laravel 11, le pipeline entier peut s’exécuter à l’intérieur d’une transaction de base de données.
Vous pouvez aussi spécifier une connexion de base de données particulière.
Si l’un des pipes lève une exception, toute la transaction est annulée.

Exemple pratique : pipeline de traitement de commande

Voici un exemple de traitement de commande e-commerce structuré en plusieurs pipes.
1

Créer les classes de pipe

2

Exécuter le pipeline

Implémentation interne du Pipeline

La méthode carry() est le cœur du pipeline. Elle utilise array_reduce pour replier les pipes de droite à gauche et construire une chaîne de closures.
En inversant l’ordre des pipes via array_reverse avant de les passer à array_reduce, l’ordre d’appel est préservé : la pile de closures se construit depuis l’intérieur, de sorte que le premier pipe s’exécute en premier.
Le pipeline est aussi appelé architecture « oignon ». La requête traverse depuis la couche externe (le premier pipe) vers l’intérieur, la réponse remonte de l’intérieur vers l’extérieur. C’est pourquoi chaque middleware peut ajouter du traitement avant et après l’appel à $next().

Combinaison avec le trait Macroable

La classe Pipeline utilise le trait Macroable, ce qui vous permet d’ajouter vos propres méthodes.

Étapes suivantes

Trait Macroable

Découvrez comment ajouter vos propres méthodes aux classes existantes avec le trait Macroable.
Dernière modification le 13 juillet 2026