Является ли контроллер на шаблоне MVC таким же, как шаблон контроллера страниц, описанный Мартином Фаулером? - PullRequest
2 голосов
/ 16 марта 2012

У меня есть опыт работы с веб-приложениями MVC (Zend Framework). Когда я искал более подробное описание каждого слоя шаблона MVC (то есть модель, представление, контроллер), я обнаружил шаблон Page Controller, который описывает поведение, подобное тому, которое вы видите на изображении ниже:

http://martinfowler.com/eaaCatalog/pageController.html

Page Controller

Шаблон MVC:

http://martinfowler.com/eaaCatalog/modelViewController.html

MVC

Пока что я могу выявить различия в том, что контроллер в шаблоне MVC, обнаруженный в различных приложениях, фактически реализует бизнес-логику, решая действия над объектами модели. Иногда эти действия будут выполняться в шаблоне репозитория вместо прямого доступа к объектам модели. Таким образом, вы найдете приложения, которые имеют служебный уровень в качестве фасада для бизнес-логики, в таких случаях контроллеры тонкие и не имеют никакой бизнес-логики, просто логика представления, в соответствии с которой представление определяется в соответствии с данными http-запроса и данными. возвращается Сервисом (или Репозитарием).

Главный вопрос. Реализует ли MVC шаблон Page Controller как есть? Или контроллер на MVC похож, но имеет четкую структуру?

Вызов контроллера, реализующего бизнес-логику, PageController не звучит правильно, поскольку это не просто «контроллер страницы». Но если мы удаляем бизнес-логику из контроллера, имеет смысл назвать ее «контроллером страницы».

1 Ответ

5 голосов
/ 22 марта 2012

Немного предыстории по теме.

Для начала, вы должны понимать, что невозможно написать классический MVC на PHP.В классическом паттерне View отслеживает уровень модели на предмет любых изменений и запрашивает новые данные при обнаружении таких изменений.Что невозможно, когда View попадает в чей-то телефон на другой стороне планеты или на МКС в этом отношении.

Ближайшая классическая структура, которую вы можете получить, - MVC Model2 (некоторые называют это "Web MVC").В этом шаблоне представление взаимодействует со слоем модели через services .Эти сервисы, в свою очередь, охватывают реализацию модели предметной области (как определено в этой книге ) и абстракции постоянства.И View запрашивает все данные, которые ему нужны, от указанных сервисов.

Другими популярными вариантами исходной темы MVC являются MVVM и MVP (существует также шаблон HMVC, который не имеет прямого отношения к другим и является вариантом PAC.).Как вы могли заметить, M и V остаются во всем, но «управляющая структура» имеет разные названия.Это потому, что каждый из них делает разные вещи.

Примечание: Обычно, когда вы читаете о какой-то платформе, которая использует «MVC» для маркетинговых целей, им нечегоделать с этим шаблоном.Вместо этого они просто Ruby On Rails клонов различного качества (или их отсутствие).

Bact на оригинальный вопрос ..

КороткийОтвет будет таким: НЕТ .

Вы должны иметь в виду, что PoEAA был выпущен в 2002 году. Ситуация немного изменилась.Теперь HTTP-запрос обычно обрабатывается Front Controller , который затем предоставляет параметры для создания Controller.

Для Controller все еще характерно создавать экземпляры структур из Model layer, но View может быть создан либо внутри контроллера, либо на основе объекта Response, который может быть возвращен (или просто изменен)) на Controller.

Кроме того, хотя в общем случае между View и Controller все еще существует отношение 1: 1, будут ситуации, когда тот же самый Controller вызывается для генерации JSON,вместо HTML.Это приведет к тому, что контроллер выберет другое представление, поскольку в случае JSON-ориентированного View он будет пытаться накопить некоторые конкретные данные из Model layer и создать одну из нескольких возможных структур данных.Который затем кодирует и представляет пользователю (который в этом случае, скорее всего, будет объектом XRH в браузере).

И эти отклонения охватывают только Model2 и частично MVP.

Обновление v2:

В контроллере веб-приложения основной задачей является передача данных из запроса (предпочтительно абстрагированных) на уровень модели и, таким образом, - изменение состояния модели.Контроллер также может изменять состояние текущего экземпляра представления.Обычно это происходит, когда вы хотите изменить формат вывода.

Создание структур слоя представления и модели может (и обычно - должно) располагаться вне самого контроллера.

Также обратите внимание, что это не то, что делают шаблоны MVP и MVVM, которые стремятся собирать данные со слоя модели в «контроллере», манипулировать / реструктурировать эти данные и только затем передавать их в View.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...