Laravel любит подавать свои фичи с фанфарами. "Pipeline — мощный механизм обработки". Да-да, слышали. На деле это обычный конвейер: у тебя есть данные, ты их суёшь в трубу, они пролетают через несколько функций-обработчиков, и на выходе получаешь что-то более-менее переваренное.

Если у тебя в коде несколько шагов подряд — типа валидации, логирования, авторизации — pipeline выглядит прилично. Но если ты начнёшь пихать туда всё подряд, будет адский спагетти-цилиндр.

Суть

Pipeline — это та же цепочка вызовов функций. Только в Laravel это завёрнуто в красивый фасад Pipeline, чтобы программист чувствовал себя архитектором, а не сантехником, который прокладывает трубы.

Простейший обработчик — функция, которая принимает данные и $next, решает что-то сделать и передаёт дальше:

function validateData($data, $next) {
    if (empty($data['email'])) {
        throw new \Exception("Без email-а никуда.");
    }
    return $next($data);
}

function logData($data, $next) {
    \Log::info("Пропускаем через трубу: ", $data);
    return $next($data);
}

Как это собрать

Laravel даёт два варианта:

  • Примитивный pipeline() вызов, если тебе лень.
  • Фасад Pipeline, если хочешь "красиво".

В лоб:

use Illuminate\Pipeline\Pipeline;

$data = ['name' => 'John Doe', 'email' => 'john@example.com'];

$result = app(Pipeline::class)
    ->send($data)
    ->through([
        validateData::class,
        logData::class,
    ])
    ->thenReturn();

Что тут происходит? Берём данные, прогоняем через обработчики, получаем то, что не умерло в процессе.

Где это юзать

  • Контроллеры. Типичный случай: данные из реквеста надо проверить, почистить, залогировать.
  • Сервисные классы. Когда у тебя шагов обработки становится слишком много, и ты хочешь их как-то упорядочить, а не держать простыню if/else.
  • Всякий кастомный ад. Например, если нужно пропустить объект через десяток "фильтров", которые выбирают, имеет ли он право жить.

Подводные камни

  • Магия превращается в мусор. Когда обработчиков становится 10+, половина из них тупо дублируют друг друга. Через месяц ты уже не помнишь, в каком именно обработчике валидируется email, а где логируется user_id.
  • Отладка боль. Когда что-то падает посередине, ты сидишь и гадаешь: "А на каком шаге это всё сломалось?". Да, можно кидать вардампы, можно ловить исключения, но удовольствие сомнительное.
  • Преждевременная абстракция. Очень часто люди пихают pipeline туда, где хватило бы банальной последовательности вызовов в методе. Только потом у них "гибкая архитектура", в которой каждый чих обёрнут в класс, и разгрести это без бутылки тяжело.

Вывод

Pipeline — это не "мощный инструмент", а банальный конвейер. Нормально помогает, когда реально нужно гонять данные через несколько независимых шагов. Но не строй из него золотой унитаз: если можно обойтись простым кодом, обойдись.

А то вместо аккуратной трубы получится выгребная яма с десятками ненужных обработчиков, где каждый следующий разработчик будет только материться.