У PHP 8.5 з’явився pipe operator (|>), який передає значення зліва як аргумент для callable-об'єкта справа. Хоча він працює з будь-якою функцією, що приймає один аргумент, вбудовані функції PHP та класи Laravel не були під нього адаптовані. Бібліотека Piper заповнює цю нішу: вона перетворює методи Laravel для роботи з колекціями та рядками на окремі curried-функції, спеціально створені для використання з pipe operator.
# Робота з нативними значеннями
У Laravel класи Collection та Stringable дозволяють будувати ланцюжки методів через об'єкт-обгортку: ви ініціалізуєте процес через collect(), а наприкінці викликаєте ->all() або ->toString(). Piper пропонує інший підхід — його функції працюють безпосередньо з нативними масивами та рядками:
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"
У цьому конвеєрі немає об’єктів-обгорток. Кожна функція приймає масив і повертає масив (або рядок у випадку join()), а pipe operator послідовно передає дані далі. Це ідеально підходить для синтаксису |> і стає логічною альтернативою Collection, коли ви працюєте з чистими даними.
# Карровані функції для pipe-ланцюжків
Кожна функція Piper реалізована так, що після передачі конфігураційних аргументів вона повертає closure, яка чекає на вхідне значення. Наприклад, filter(fn (int $i) => $i % 2 === 0) сама по собі нічого не фільтрує — вона повертає callable-об'єкт, який обробить масив, отриманий через |>. Саме завдяки цьому код на кшталт replace('world', 'Piper') виглядає природно всередині ланцюжка:
use function Spatie\Piper\Str\{lower, replace};
$greeting = 'Hello, World!'
|> lower()
|> replace('world', 'Piper');
// "hello, Piper"
# Поєднання операцій над масивами та рядками
Оскільки Piper оперує нативними типами, кроки для масивів і рядків можна вільно змішувати в одному конвеєрі. Список можна перетворити на рядок прямо посеред ланцюжка і продовжити трансформацію:
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"
Namespace Arr містить такі функції, як filter, map, values та join, а Str — lower, upper, replace, prefix, suffix тощо. Назви методів та їхня логіка ідентичні до аналогів із Laravel, тому API буде цілком знайомим для користувачів Illuminate\Support.
# Встановлення
Для роботи Piper потрібен PHP 8.5. Встановити бібліотеку можна через Composer:
composer require spatie/piper
Після цього імпортуйте необхідні функції з просторів імен Spatie\Piper\Arr та Spatie\Piper\Str.
Повна документація доступна на сайті Spatie, а вихідний код — на GitHub.