Тонкие контроллеры. Куда вынести логику построения запросов и фильтрации в Laravel

Рейтинг: 0Ответов: 1Опубликовано: 07.07.2023

У меня есть приложение с REST API, в котором я хочу использовать тонкие контроллеры и вынести всю бизнес-логику в Service-классы. Однако возникла проблема с index методом, где используется ORM для построения запросов. Получаются очень большие запросы, из-за того, что приходится присоединять много других таблиц, в том числе и с агригацией. Особенно всё плохо с полиморфными сущностями. Это всё делается на уровня запроса, а не связей модели т.к. нужно сортировка на БД по присоединённым полям. В сервис это всё переносить, мне кажется не правильно, а в контроллере оставлять тем более.

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

Ответы

▲ 2Принят

Если вы используете Eloquent, то используйте его возможности. В вашем случае - это scopes. Для того чтобы вынести отдельные методы в отдельный класс, не нужны какие-то хитровыдуманные паттерны. Просто вынесите их в trait или кастомный Query Builder.

Вам могут посоветовать использовать так называемые Repository или Queries классы. Но никакого профита, используя Eloquent или ActiveRecord, вы от них не получите. Те же scopes, только названы по другому, и все усложняют. Намного легче разобраться в scopes, чем в этих классах "репозиториев". И уж тем более они не имеют ничего общего с паттерном репозиторий.