Немного о MVC:
В исходном паттерне MVC (представленном Trygve Reenskaug в 1979 году) контроллер обновляет модель, модель уведомляет представление об изменениях, ипредставление извлекает свои данные из него.Хотя шаблон был задуман для настольных приложений - каждая «триада» MVC связана с одним элементом управления в окне (кнопка, текстовое поле, флажок и т. Д.).Таким образом, к каждому элементу управления на экране был прикреплен MVC.
Поскольку в веб-приложениях шаг уведомления модели к представлению отсутствует (или не может быть), исходный шаблон можетне применять как есть к ним.Но наиболее похожий подход все же может быть относительно легко реализован: контроллер обновляет модель, представление извлекает из нее данные (независимо от контроллера).Я думаю, что это называется "Web MVC Model 2" .
Существует множество вариаций Web MVC.Вы используете тот, в котором контроллер играет роль посредника между моделью и представлением.Таким образом, контроллер является единственным компонентом, взаимодействующим с моделью.
Ответственность за представление:
Ответственность за компонент представления заключается в представлении логика - что вообще не должно приниматься контроллером.Помимо загрузки и рендеринга файлов шаблонов, этот тип логики включает подготовку данных, извлеченных из модели, для отображения .Результатом подготовки должен быть, предпочтительно, список значений примитивных типов (строки, логические значения, целые числа, массивы и т. Д.), Которые можно легко «внедрить» в файлы шаблонов в процессе загрузки и рендеринга.
Примеры логики представления:
Пример № 1: Если вы получите значение 123.45
(из столбцаamount
таблицы revenues
) из модели, логика представления будет состоять из форматирования ее в строку 123.45 USD
для отображения в файле шаблона.
Пример # 2: Форматирование извлеченного значения даты от 28/05/2019
до 2019-05-28
с использованием фрагмента кода, подобного следующему:
$fetchedDateFromModel = '28/05/2019';
$time = strtotime($fetchedDateFromModel);
$formattedDate = date('Y-m-d', $time);
Тогда значение $formattedDate
будет«внедрено» в файл шаблона.
Пример # 3: Установка логического значения на основе некоторых данных модели для использования в файле шаблона длярешить, должна ли кнопка («Получить бонус») быть активной или нет.
$paidAmount = 512.79; /* model data */
$isActiveGetBonusButton = false;
if ($paidAmount > 500) {
$isActiveGetBonusButton = true;
}
Ответr (в отношении выбранного вами подхода MVC):
Используя экземпляр View
во всех контроллерах, вы будете вынуждены выполнять определенную логику представления в каждом контроллере - перед передачей его результата (например,список подготовленных значений) к используемому экземпляру View
, чтобы в дальнейшем просто «внедриться» в определенный файл шаблона.
Принимая во внимание, что если вы реализуете выделенный класс представления (например, * 1068)* - которые, предпочтительно, наследуют базовый класс View
, содержащий метод render()
) для класса контроллера (например, PostController
) - таким образом, отношение 1: 1, но воспринимайте его как свободный!- вы можете передать данные, извлеченные из модели, в неподготовленной форме из контроллера в представление.Класс представления тогда правильно взял бы на себя ответственность за подготовку данных для отображения до фактической загрузки и рендеринга определенного файла шаблона.Например, выполнение всей конкретной логики представления.
Примечание: In "Web MVC Model 2" - где, в идеале, контроллер не знает компонента представления- приведенный выше аргумент более очевиден:
-
PostController
просто обновляет модель (когда требуется шаг обновления); PostView
выбирает данные из модели, подготавливаетдля отображения и отображения (например, путем загрузки и рендеринга файла шаблона, например posts.html.twig
).Другими словами, компонент представления сам выполняет всю логику представления.