Laravel “Pipe Through” Collections Method
Published on by Paul Redmond
Laravel v8.78.1 introduces a new pipeThrough()
collection method, allowing developers to insert an array of pipe callbacks that can manipulate the collection:
Recently merged into Laravel, you will soon be able to call collect()->pipeThrough($pipes) to run a collection through an array of callbacks, passing return values into following pipes 🤩 pic.twitter.com/5m9fThcoaw
— Steve Bauman (@SteveTheBauman) January 5, 2022
The author of the pull request, Steve Bauman, shared an additional example that might help you visualize example use-cases of this method:
$process = [ // Iterate through the health checks and attempt, // filtering the collection by unsuccessful. fn ($checks) => $checks->filter( fn ($check) => ! $check->attempt() ), // Iterate through all the unsuccessful checks // notifying their users of each failed check. fn ($unsuccessful) => $unsuccessful->each( fn ($check) => $check->users()->each( fn ($user) => $user->notify( new HealthCheckFailed($check) ) ) )]; collect(HealthChecks::all())->pipeThrough($process);
The pipeThrough() method is a flexible way to run whatever collection code you have through a series of callbacks and invokable classes. Yet, the implementation is simple. Here’s the pipeThrough method in the Collection class at the time of release:
public function pipeThrough($pipes){ return static::make($pipes)->reduce( function ($carry, $pipe) { return $pipe($carry); }, $this, );}
A related method in the Collection class is the pipe() method, which accepts a single callable and returns the result of the executed closure.
$collection = collect([1, 2, 3]); $piped = $collection->pipe(function ($collection) { return $collection->sum();});
If you’d like to learn more about the pipeThrough method, check out Pull Request #40253. Also, you can see the complete list of changes between 8.78.0 and this week's 8.78.1 release on GitHub.