Я изучал парадигму модель-представление-контроллер («MVC»), но я очень запутался, поскольку некоторые учебники противоречат другим учебникам.
Мое текущее понимание процесса выглядит примерно так:
Маршрутизатор / Диспетчер / Фронт-контроллер:
- Маршрутизатор, хотя и не упоминается в названии MVC, по-прежнему является очень важной частью. Именно здесь запросы переводятся из необработанных URL-адресов на конкретный контроллер. Например, маршрутизация запроса на www.StackUnderflow.com/question/123 к контроллеру вопросов приложения.
Модель:
Здесь необработанные данные собираются из некоторого источника хранения, такого как база данных или XML-файл. Модель служит уровнем абстракции, преобразуя запрос Контроллера для определенных данных в (например) запрос SQL и преобразуя результаты запроса в стандартный формат, такой как объект данных.
Например, в сценарии / browse / all, указанном выше:
- The "Question" Controller would ask the Model "Please give the data for question 123."
- Затем Модель преобразует это в «ВЫБРАТЬ * ИЗ ВОПРОСОВ, ГДЕ Id = 123;» и перенести его в базу данных
- База данных вернет в Модель запись «Вопрос».
- Модель возьмет запись и переведет ее в объект данных вопрос.
- Затем модель просит сделать то же самое: «SELECT * FROM Answers WHERE QuestionID = 123;» и создает массив объектов Answer из набора результатов и добавляет его к переменной-члену answers объекта Question.
- Модель вернет объект "Вопрос" в Контроллер "Вопрос".
Контроллер:
Это настоящая рабочая лошадка приложения. Помимо ретрансляции сообщений в Модель и Представление, Контроллер также отвечает за такие вещи, как авторизация
и приложение / "бизнес-логика"Изменить: Согласно ответу, бизнес-логика принадлежит модели.В текущем примере Контроллер будет отвечать за:
- Ensuring the user is logged in.
- Определение QuestionId из URL-адреса.
- Определение того, какой вид использовать.
- Отправка кодов HTTP и перенаправление при необходимости.
- Запрос данных у модели и сохранение необходимых данных в переменных-членах.
Вид:
- По большому счету, View - это самая простая часть приложения. В основном это базовое приложение, состоящее из HTML-шаблонов. Эти шаблоны будут иметь заполнители для вставки данных в шаблон из переменных-членов контроллера:
e.g.
<html>
<head>
<title>
<?php $question->getTitle() ?>
</title>
</head>
<body>
<h1> <?php $question->getQuestionText(); ?> </h1>
<h2> Answers: </h2>
<div class="answerList">
<?php formatAnswerList($question->getAnswers()); ?>
</div>
</body>
</html>
- Представление также будет содержать методы форматирования данных для доставки пользователю. Например, приведенный выше метод
formatAnswerList()
будет принимать массив ответов, взятых из Контроллера, и перебирать их в цикле, вызывая что-то вродеinclude $markupPath . "/formatAnswer.inc"
, которое будет небольшим шаблоном просто контейнера ответа.
Вопросы:
- Насколько точен этот взгляд на MVC?
- Если нет, пожалуйста, внимательно объясните, какие компоненты неуместны, где они должны быть на самом деле и как они должны правильно взаимодействовать с другими компонентами (если вообще).
- Сколько классов используется для описания этого? В моем примере есть четыре объекта - по одному для трех компонентов MVC и один, который просто хранит связанные данные для передачи. Это нормально, или нужно комбинировать некоторые из них. Если да, то какие?