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



Книга 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 для извлечения записей, которые соответствуют фильтрам.


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


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

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



645   0  

Comments

    Ничего не найдено.