Лучше, чтобы ваш View обращался к объекту модели предметной области объектно-ориентированным способом, а не с помощью контроллера для преобразования данных модели в простые скаляры и массивы.
Это помогает удержать контроллер от чрезмерного увеличения веса. См. Шаблон Анемичная модель домена . Контроллеру нужно только знать, какую модель нужно создать, передать входные данные запроса в эту модель, а затем внедрить модель в скрипт View и выполнить рендеринг. Помните, что Модель предметной области не является классом доступа к данным .
Вы также можете написать View Helpers , чтобы инкапсулировать общий рендеринг объекта модели домена, чтобы вы могли повторно использовать его в нескольких скриптах View.
Ваше представление должно обращаться к доменной модели только для чтения. Скрипты представления не должны пытаться вносить изменения в модель предметной области.
Вы также можете спроектировать свою модель домена для реализации ArrayObject или других типов SPL, если это необходимо для упрощения использования ОО в сценарии View.
Это правда, большая движущая мотивация дизайна MVC и OO в целом - это развязка . Мы хотим, чтобы каждый слой оставался неизменным, так как другие слои изменяются. Только через их общедоступные API слои взаимодействуют.
ViewModel является одним из решений для абстрагирования модели, так что представление не нужно менять. Я обычно использую модель домена, которая абстрагирует детали проектирования таблиц и т. Д. И предоставляет API, который больше ориентирован на бизнес, а не на доступ к данным. Поэтому, если ваши базовые таблицы изменятся, View не должен знать об этом.
Я ожидаю, что если в доменной модели произойдут изменения, например, ей потребуется предоставить атрибут нового типа, то вполне вероятно, что ваше представление все равно меняется, чтобы показать этот новый атрибут в пользовательском интерфейсе.
Какой метод вы выберете для отделения одного слоя от других, зависит от того, какие типы изменений вы ожидаете чаще всего, и будут ли эти изменения действительно независимыми изменениями или в любом случае потребуют изменения нескольких слоев.