PHP

MVC-архитектура на PHP. Laravel и не только

Какими должны обязанности у модели? Встречал много разных мнений по этому поводу. Например, такие:
1) Модель должна быть толстой и содержать в себе всю бизнес-логику: поля, валидация, запросы к базе, геттеры, сеттеры и так далее.
2) Модель должна быть тонкой, валидация выносится в отдельные классы, запросы выносятся в сервисы и репозитории.
Что во втором случае должна содержать в себе модель? Только геттеры и сеттеры, какую-то информацию о полях? Если используются сервисы и репозитории, имеет ли право контроллер обращаться напрямую к ORM-модели для выполнения каких-то простых запросов? Или он всегда должен обращаться к ней строго через дополнительный слой в виде сервисов и репозиториев?
Современный подход состоит в том, что модель должна содержать ТОЛЬКО бизнес-логику. Модель НЕ должна ничего знать о том, как и где хранятся данные.

Модель вообще не знает, что такое "база данных" и работает только с объектным представлением данных. Трансляцию же данных между объектным представлением и физическим хранилищем должен реализовывать отдельный слой доступа к данным.

Это легко реализовать в Data Mapper (Doctrine, Cycle ORM), но сложно в Active Record (большинство PHP'шных ORM). Проблема AR в том, что в нём смешиваются в одну кучу слой работы с физическим хранилищем и слой модели.

Да, AR удобно использовать в быстрой разработке, но при этом объектная структура данных приколачивается гвоздями к структуре таблиц в базе данных. И это сильно усложняет жизнь при необходимости поменять структуру данных или структуру таблиц.

Советую прочитать серию из 5 уроков https://elisdn.ru/blog/104/domain-entities-modelling (в конце каждой статьи ссылка на следующую): там подробно разбирается, и как создавать объектную модель и бизнес логику, и как делать отдельный слой доступа к данным - в том числе и при использовании AR.
РО
Рустам Одинцов
63 193
Лучший ответ
Модель должна содержать в себе все то, что не содержит Controller и View.
Я как раз сейчас пишу MVC на php с нуля, у меня модель принимает параметры, запрошенные пользователем, от контроллера, общается с базой через отдельный класс DB и подготавливает структуры, которые затем передает во View.
Юрий Муравенко
Юрий Муравенко
18 381
MVC архитектура практически не встречается в современных фреймворках в чистом виде, т.к. они стараются охватить очень широкий круг задач. Некоторые задачи (в том числе и работа с БД) очень сложно вписать в эту архитектуру. Поэтому и появляются целые структуры из контроллеров, различные слои моделей и активные (с логикой) представлениия...
Ggm Ggm93
Ggm Ggm93
8 866