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 — это не "мощный инструмент", а банальный конвейер. Нормально помогает, когда реально нужно гонять данные через несколько независимых шагов. Но не строй из него золотой унитаз: если можно обойтись простым кодом, обойдись.
А то вместо аккуратной трубы получится выгребная яма с десятками ненужных обработчиков, где каждый следующий разработчик будет только материться.
0 комментариев