@GregIv

Что такое M в MVC? Что такое модель Active Record'a? Что должно быть в модели AR?

Добрый день!

Существует спор, что лучше толстый контроллер или толстая модель? Как правило говорят, что модель. Однако многие уважаемые люди, утверждают что лучше — тонкий контроллер, тонкая модель, + вся логика в отдельных классах.
Хм...Еще часто не понятно, в каком контексте употребляется слово модель?
Я так понимаю, что модель в MVC - это не просто модель Active Record, а набор всех классов, что работают с данными между тонкими контроллером и видом.
Также следует упомянуть, что c одной таблицей может быть связанно куча разного функционала.

Собственно вопросы:
1) Что такое модель Active Record’a?
  • а) Сущность — объект. Имеет методы взаимодействия с др. сущностями к примеру $cart→addItem($item) + CRUD методы.
  • б) Набор CRUD методов, по сути процедурный подход?

2) Как создавать модели?
  • а) Для каждой таблицы одна модель
  • б) Для каждой задачи своя модель, т. е. для одной таблицы может быть несколько моделей.


P.S.
Полагаю, что конкретно Active Record тут не при чем, и этот вопрос также актуален и для других ORM-паттернов
  • Вопрос задан
  • 617 просмотров
Решения вопроса 1
@AlexndrNovikov
Solution Architect in Spiral Scout
Active Record - это паттерн, его каноническое разъяснение можно почитать у Фаулера.
design-pattern.ru/patterns/active-record.html
https://www.martinfowler.com/eaaCatalog/activeReco...

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

Представь приложение, где надо к примеру обработать изображение, наложить 3 фильтра, развернуть, залить копию на облако, а вторую выплюнуть в браузер. Логика какая-то нужна? Однозначно, столько действий. Реализуется контроллерами? нет, контроллеру надо просто понять что за запрос и кому его делегировать. Вьюхами? тем более нет, это не про обработку данных. Значит моделями. Что ж тогда, AR лепить (если исходить из AR=модель)? А причем тут AR, в приложении даже базы нет :) Модель понятие гораздо более широкое, и способов организации кода на этом слое неизмеримо больше, чем один паттерн.

Собственно "модель Active Record-а" - это справедливо для тупых приложений типа CRUD без малейшей логики, кроме сохранения данных в базу, чтения их оттуда, апдейта из формочек и удаления. Где вся логика (слой M приложения) заключается в CRUD-ах.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 3
@backender_ru
https://backender.ru/
В Yii подход одна таблица - одна AR модель.
А вообще M это не AR, это вообще вся бизнес логика вашего веб-приложения.
У вас может быть два класса, к примеру, один реализует логику в виде методов addItem, removeItem, getItems, и при этом этот класс зависит от соответствующей AR модели.

Держать всю логику в контроллерах глупо, к примеру вам потребуется к вашему приложению CLI код, который будет работать со своими контроллерами.

Контроллер должен передать данные в модель, получить от нее ответ и отобразить во View.
Ответ написан
Комментировать
Sanasol
@Sanasol
нельзя просто так взять и загуглить ошибку
M - model чего угодно и как угодно. Это данные и их обработка.
Active record это шаблон проектирования и к моделям как бы вообще не относится, в смысле косвенно относится.
Active record вообще сам по себе является антипаттерном и нарушает другие общепринятые принципы типа SOLID.

1) Что такое модель Active Record’a?
а) crud вообще более глобальная вещь в active record, и да все модели наследуются и содержат в себе эти методы. И другие сущности здесь тоже не при чем.
б) шта?

Active Record это простая/удобная работа с хранилищем данных и ничего больше.
Всё остальное это относится к модели в MVC в целом. Обработка данных, взаимодействие с другими вещами т.д.

2) Как создавать модели?
а) да
б) зачем одному набору данных несколько моделей, если данные одни и те же? Если они обрабатываются по разному, то обработчики надо разные делать, а не модели.

этот вопрос также актуален и для других ORM-паттернов

Другие ORM-паттерны это другие паттерны, и к active record они никак не относятся т.к. полностью другой подход ко всему этому.
Ответ написан
Комментировать
@GregIv Автор вопроса
Добавлю к ответам ссылку:
https://habrahabr.ru/post/321050/
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы