Laravel Packages

Piper: Laravel-Style Array and String Helpers for PHP's Pipe Operator

Published
Piper: Laravel-Style Array and String Helpers for PHP's Pipe Operator image

PHP 8.5 introduced the pipe operator (|>), which passes the value on its left as the argument to the callable on its right. It works with any single-argument callable, but PHP's built-in functions and Laravel's chainable classes weren't designed around it. Piper fills that gap: it ports Laravel's collection and string methods into standalone, curried functions made to sit on the right side of a pipe.

Working on plain values

Laravel's Collection and Stringable are method-chainable because you're working with a wrapper object: you collect() going in and call ->all() or ->toString() coming out. Piper takes a different route suited to the pipe operator — its functions operate directly on native arrays and strings:

use function Spatie\Piper\Arr\{filter, map, values, join};

$result = [1, 2, 3, 4, 5, 6]
    |> filter(fn (int $i) => $i % 2 === 0)
    |> map(fn (int $i) => pow($i, 2))
    |> values()
    |> join(', ', ', and ');

// "4, 16, and 36"

There's no wrapper instance in that pipeline. Each function takes an array, returns an array (or in the case of join(), a string), and the pipe operator threads the value through. It's a style that fits the |> syntax, and a natural companion to Collection when you're already working with native values.

Functions are curried for the pipe

Each Piper helper is written so that calling it with its configuration arguments returns a closure waiting for the value being piped. filter(fn (int $i) => $i % 2 === 0) doesn't filter anything on its own — it returns a callable that filters whatever array arrives via |>. That's what lets replace('world', 'Piper') read naturally inside a chain:

use function Spatie\Piper\Str\{lower, replace};

$greeting = 'Hello, World!'
    |> lower()
    |> replace('world', 'Piper');

// "hello, Piper"

Mixing array and string steps

Because the functions pass native values, an array step and a string step belong to the same pipeline. A list can be reduced to a string partway through and keep going:

use function Spatie\Piper\Arr\{map, join};
use function Spatie\Piper\Str\{upper, prefix};

$headline = ['laravel', 'news']
    |> map(fn (string $word) => ucfirst($word))
    |> join(' ')
    |> upper()
    |> prefix('>> ');

// ">> LARAVEL NEWS"

The Arr namespace covers helpers like filter, map, values, and join; the Str namespace covers lower, upper, replace, prefix, suffix, and others. The method names and behavior mirror Laravel's, so the API is already familiar if you've used Illuminate\Support.

Installation

Piper requires PHP 8.5 for the pipe operator. Install it with Composer:

composer require spatie/piper

Then import the functions you need from the Spatie\Piper\Arr and Spatie\Piper\Str namespaces.

Full documentation is available on the Spatie docs site, and the source is on GitHub.

Paul Redmond photo

Staff writer at Laravel News. Full stack web developer and author.

Sponsored

acquaintsoft logo
Acquaint Softtech

Hire Laravel developers with AI expertise at $20/hr. Get started in 48 hours.

Visit Acquaint Softtech

The latest

View all →
UUID Request Input and Migration Failure Events in Laravel 13.42 image

UUID Request Input and Migration Failure Events in Laravel 13.42

Read article
Replay Missed Laravel Scheduled Tasks With Schedule Catchup image

Replay Missed Laravel Scheduled Tasks With Schedule Catchup

Read article
Search Polymorphic Relations and Filament Tables With Laravel Searchable image

Search Polymorphic Relations and Filament Tables With Laravel Searchable

Read article
Laravel Rest Api 3.0: Typed Fields, Metrics, and OpenAPI Docs image

Laravel Rest Api 3.0: Typed Fields, Metrics, and OpenAPI Docs

Read article
Real-Time Inertia Props With Laravel Reverb image

Real-Time Inertia Props With Laravel Reverb

Read article
PhpStorm 2026.3 Adds an Agent Workspace and PHP 8.6 Support image

PhpStorm 2026.3 Adds an Agent Workspace and PHP 8.6 Support

Read article