Laravel: неизвестный, но эффективный способ реализации фильтров в Eloquent

Перейдем сразу к сценарию: нужно на основе определенных фильтров получить список пользователей. Например, всех пользователей от 10 до 20 лет с активным статусом.

Казалось бы, все просто и выполнимо: добавляем несколько операторов if else для построения запроса в Eloquent, и готово! Веб-приложение отлично работает, и клиенты очень довольны…

Но через несколько месяцев требуется добавить еще фильтров и более сложную бизнес-логику. И вот функция разрастается уже до нескольких сотен строк, а отладка превращается в кошмар! Как же теперь с этим справиться?

Вы что-нибудь слышали о pipeline? Pipeline (конвейер)  —  это красивый шаблон проектирования объектно-ориентированного программирования (ООП). Его название говорит само за себя. Объект отправляется в конвейер, где он проходит несколько задач, прежде чем достигнет окончательной формы.

Для использования конвейера не нужно устанавливать никаких пакетов  —  в Laravel уже давно все интегрировано. Остается только задействовать все это для построения запроса пользователей в Eloquent с применением фильтрации.

Создадим фильтр пользователей с помощью Pipeline.

Ниже приводится способ организации фильтровочных конвейеров, так что выбирайте тот, что лучше всего вам подходит. Сначала в каталоге app создали папку filters. Внутри находится интерфейс Pipe, который будет реализован всеми фильтрами. Таким образом обеспечивается реализация требуемой функции всеми объектами фильтровочного конвейера.

Файл pipe.php в каталоге app/filters

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

Реализация UserAgeFilter.php в каталоге app\filter\user
Реализация UserUserFilter.php в каталоге app\filter\user

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

Реализация конвейера для фильтрации данных о пользователях

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

Вот как выглядит ресурсный файл пользователей:

Реализация ресурсного файла пользователей

И точно так же реализовывается простой и выполнимый процесс фильтрации с использованием конвейера.

Читайте также:

Читайте нас в TelegramVK и Яндекс.Дзен


Перевод статьи Joy Debnath: Laravel: One unfamiliar but effective way of implementing filters in Eloquent

Предыдущая статья8 причин использовать Pydantic для улучшения парсинга и валидации данных
Следующая статьяАрхитектура виртуальной машины Java: объяснение для начинающих