Wat is het pipelinepatroon?
Het pipelinepatroon is een designpattern waarbij een te verwerken object (de passable) achtereenvolgens door een reeks pipes (verwerkingsstappen) wordt geleid. Elke pipe ontvangt de uitvoer van de vorige stap, voegt bewerking toe en geeft het door aan de volgende stap. In Laravel implementeert de klasseIlluminate\Pipeline\Pipeline dit patroon, en de verwerking van middleware werkt precies volgens dit mechanisme.
Waar het in de Laravel-core wordt gebruikt
De pipeline wordt breed ingezet in de kern van Laravel.- HTTP-middleware —
Illuminate\Foundation\Http\Kernelleidt de request door de middleware-pipeline - Consolecommando’s — voor- en nabewerking van Artisan-commando’s
- Middleware van de router — het toepassen van middleware op routegroepen
Basisgebruik
send / through / thenReturn
De eenvoudigste opbouw van een pipeline.send($passable)— geeft het object op dat door de pipeline gaatthrough($pipes)— geeft de array van pipes opthenReturn()— voert de pipeline uit en geeft het resultaat terug
then
Wil je de laatste bewerking als closure opgeven, dan gebruik jethen().
pipe
Om achteraf pipes toe te voegen, gebruik jepipe().
Klassegebaseerde pipes
Door dedicated klassen te gebruiken in plaats van closures, verhoog je de herbruikbaarheid. Elke pipe-klasse implementeert eenhandle-methode.
via — de aan te roepen methode wijzigen
Standaard wordt dehandle-methode van de pipe aangeroepen, maar met via() kun je een andere methodenaam opgeven.
Parameters doorgeven aan pipes
Met: en , in de klassenaam kun je parameters aan een pipe doorgeven. Dit is hetzelfde mechanisme als de middleware-syntaxis zoals throttle:60,1.
finally — verwerking na afloop van de pipeline
Met definally()-methode registreer je een callback die na afloop van de pipeline altijd wordt uitgevoerd — ongeacht succes of falen.
withinTransaction — uitvoeren binnen een transactie
Sinds Laravel 11 kun je de hele pipeline binnen een databasetransactie uitvoeren.Praktijkvoorbeeld: een orderverwerkingspipeline
Een voorbeeld waarin de orderverwerking van een webshop uit meerdere pipes is opgebouwd.1
Maak de pipe-klassen
2
Voer de pipeline uit
De interne implementatie van Pipeline
Decarry()-methode is het hart van de pipeline. Met array_reduce worden de pipes van rechts naar links gevouwen tot een keten van closures.
array_reverse om te keren en aan array_reduce door te geven, blijft de aanroepvolgorde correct. De closure-stack wordt van binnen naar buiten opgebouwd, zodat de eerste pipe als eerste wordt uitgevoerd.
Combineren met de Macroable-trait
Omdat dePipeline-klasse de Macroable-trait gebruikt, kun je er eigen methodes aan toevoegen.
Volgende stap
Macroable-trait
Leer hoe je met de Macroable-trait eigen methodes toevoegt aan bestaande klassen.