Перейдем сразу к сценарию: нужно на основе определенных фильтров получить список пользователей. Например, всех пользователей от 10 до 20 лет с активным статусом.
Казалось бы, все просто и выполнимо: добавляем несколько операторов if else
для построения запроса в Eloquent, и готово! Веб-приложение отлично работает, и клиенты очень довольны…
Но через несколько месяцев требуется добавить еще фильтров и более сложную бизнес-логику. И вот функция разрастается уже до нескольких сотен строк, а отладка превращается в кошмар! Как же теперь с этим справиться?
Вы что-нибудь слышали о pipeline? Pipeline (конвейер) — это красивый шаблон проектирования объектно-ориентированного программирования (ООП). Его название говорит само за себя. Объект отправляется в конвейер, где он проходит несколько задач, прежде чем достигнет окончательной формы.
Для использования конвейера не нужно устанавливать никаких пакетов — в Laravel уже давно все интегрировано. Остается только задействовать все это для построения запроса пользователей в Eloquent с применением фильтрации.
Создадим фильтр пользователей с помощью Pipeline.
Ниже приводится способ организации фильтровочных конвейеров, так что выбирайте тот, что лучше всего вам подходит. Сначала в каталоге app
создали папку filters
. Внутри находится интерфейс Pipe
, который будет реализован всеми фильтрами. Таким образом обеспечивается реализация требуемой функции всеми объектами фильтровочного конвейера.

Теперь создадим в Eloquent два фильтровочных конвейера, отвечающих за добавление фильтра возраста и статуса в конструктор запросов пользователей:


И наконец, напишем функцию, реализующую конвейер. Для получения экземпляра объекта Pipeline
нужно задействовать функцию app()
:

Здесь отправляем по конвейеру конструктор запросов пользователей, который пройдет через фильтровочные части конвейера UserAgeFilter
и UserStatusFilter
, причем в каждой из этих частей конвейера будет выполняться функция apply
. После прохождения $users
всех частей конвейера получаем окончательный запрос. И в заключение вызываем функцию get
для извлечения записей, которые соответствуют фильтрам.
Вот как выглядит ресурсный файл пользователей:

И точно так же реализовывается простой и выполнимый процесс фильтрации с использованием конвейера.
Читайте также:
- Как использовать Laravel Sail с бэкендом Docker Desktop на WSL 2
- Современный backend-разработчик
- Введение в фронтэнд и бэкэнд – основы веб-разработки
Читайте нас в Telegram, VK и Дзен
Перевод статьи Joy Debnath: Laravel: One unfamiliar but effective way of implementing filters in Eloquent