Laravel: Имеет ли смысл выносить SQL-запросы из контроллера в модель?

Боков Глеб

У меня в контроллере стало слишком много SQL-запросов. В смысле, самих запросов-то не так много, но они довольно длинные. Думаю о том, куда бы их лучше вынести из контроллера. Может, создать модель страницы и вынести туда?

Только убедительная просьба - не отвечайте абстрактно типа "это можно сделать самыми разными способами, всех и не перечесть". Пожалуйста, предложите конкретное решение, которое Вы считаете лучшим.

Мне особенно понравился такой пример организации модели, предложенный на Laracasts:

app
     /myApp (or project)
        /posts (post example, but same for all product features, Users, etc. I remove directories that are not relevant)
            /repository
            /contracts
            /commands
            /services
            /exceptions
            /events
            /documentation (I like to keep project documentation in the relevant areas vs centralized )
            /middleware
            Abstract class
            Post.php (model)
            PostManager.php (management code)

Я пока до конца не понимаю назначение и особенности всех этих элементов модели, но хотел бы разобраться.

2 ответа

Боков Глеб

На самом деле, если говорить про SOLID, то модель тоже не должна содержать логику запросов, так как 1 класс подразумевает одну ответственность, что кстати паттерн ActiveRecord, который использует Eloquent, активно нарушает - внося в модель методы для запросов к БД и не только. В общем случае, если вас не волнует технический долг, поддерживаемость кода и его тестируемость, можете оставлять запросы в контроллерах или моделях. Если же вам важна SOLID архитектура, то рекомендую добавить слой репозиториев, который будет инкапсулировать логику запросов к БД. Вот , например, хороший пакет для ларавель для внедрения репозиториев - https://packagist.org/packages/prettus/l5-repository , если не хочется писать это самостоятельно. Опять же если говорить про удобство, обычно контроллеры делают тонкими, оставляя в них минимум кода, вся бизнес-логика уходит в Сервисы или Команды(зависит от принятой архитектуры приложения), работа с базой уходит в Repositories, Models или Entities остаются лишь для описательной части(ну и коль Eloquent настаивает, то в них еще пишутся мутаторы/кастеры и вот это вот всё)


Боков Глеб

Если там пару строчек то не надо, если там сложные выборки, условия, фильтры, сортировки и тд то лучше выносить в модель чтобы не захламлять контроллер. В контроллерах должно быть минимум функционала, вся логика должна быть в моделях или в сервисах. Вся логика, что касается базы данных - в моделях

licensed under cc by-sa 3.0 with attribution.