Основы архитектуры Model View Controller (MVC )

Я планирую написать серию постов о работе с Фреймворком Yii который использую последние несколько месяцев. Перед тем как начать я хотел бы немного рассказать об архитектуре MVC (Model View Controller - Модель Представление Контроллер).
 MVC стал стандартом для фрэймворков и многих других средств разработки приложений в которых акцент делается на разделение логики приложения и его представления.
Основное понятие MVC довольно просто но на практике могут возникнуть трудности в освоение данной архитектуры. Другими словами вам может потребоваться некоторое время для понимания архитектуры но после этого дальнейшая работа будет достаточно простой. Шаблон MVC позволяет разделить данные, представление и обработку действий пользователя на три отдельных компонента:


  • Модель (Model). Модель предоставляет данные (обычно для View), а также реагирует на запросы (обычно от контроллера), изменяя свое состояние.

  • Представление (View). Отвечает за отображение информации (предоставляет пользовательский интерфейс).

  • Контроллер (Controller). Интерпретирует данные, введенные пользователем, и информирует модель и представление о необходимости соответствующей реакции (предоставляет действие).
 Я думаю, Модель (Model) легче всего будет представить как данные, которыми можно манипулировать. Модель чаще всего представляет собой таблицу базы данных, где один экземпляр модели представляет собой одну строку из таблицы. Следует помнить, что если вы имеете две связанных между собой таблицы (например, товар и категория) то каждая из них должна быть представлена отдельной моделью, а не одной! Каждая модель должна быть максимально автономной. Менее очевидное, но также часто встречающиеся l0;спользование модели это хранение не постоянных данных. Например, если на вашем сайте имеется форма обратной связи то вовсе необязательно хранить данные, отправленные пользователем, после того как они были отправлены на вашу почту, однако для формы обратной связи также необходимо использовать модель (в целях проверки правильности ввода и т.д.). Модель представляет собой не только данные, но и манипулирование с ними, от проверки введенных данных до каких либо операций с данными (например, удаление HTML тэгов, форматирование времени и т.д.).

Представления (View), используемые в веб-разработке также достаточно просты для понимания: они содержат HTML разметку. Большинство веб-фрэймворков используют одну страницу, которая выступает в качестве макета. Эта страница, например, может содержать начальные и конечные тэги HTML.  Остальные страницы могут содержать такие данные как формы, список новостей или подробный просмотр новости. Эти отдельные представления встраиваются в основной макет и формируют готовую к отображению страницу.
Если вы имеет в своем приложение данные о товарах и их категориях, то возможно у вас будут следующие файлы представлений (View):
  • Общий (первичный) макет для отображения товаров.
  • Форма для добавления и редактирования товаров.
  • Список всех товаров.
  • Подробная информация для отдельного товара.
Также у вас будут файлы представлений и для раздела о категориях товара.

Представления должны содержать не только HTML, также они могут содержать и PHP код (или любой другой язык). Этот код должен выполнять только очень простые операции, такие как вывод на экран переменной. Общепринятая ошибка новичков это слишком большой объём кода (например логика) в представлениях. Целью представления является объединение данных и вывод их на экран для создания интерфейса. Представление не должно слишком много «думать». Например, представление, должно использоваться, для того чтобы вывести на экран значение переменной, если оно установлено или использовать цикл для вывода на экран каждого значения массива, но представление не должно серьезно форматировать или изменять эти данные. Допустим, у вас есть страница, которая кроме всего прочеk5;о отображает сколько времени пользователь зарегистрирован на сайте. Изначально дата регистрации извлекается из базы данных (например, является частью модели) и после расчетов отображается в вашем представление, но расчеты должны производится в модели, не в представление (или контроллере).


Контроллер (Controller) выступает в роли «клея» между представлением и моделью, хотя это не всегда очевидно. Как я уже упомянул в самом начале, Контроллер предоставляет действие: действие с Моделью и действие с Представлением. Действие с Моделью представляют собой извлечение одной записи из базы данных или извлечение всех записей. Действие с Представлением представляют собой ответ на действия пользователей: отправка формы, загрузка страницы и т.д.
Например:
Пользователь переходит по ссылке www.example.com/goods/list . Это может повлечь за собой действие “list” в Контроллере goods. Это действие “list” может ссылаться на действие “find_all” для Модели goods, которое выберет все записи из таблицы.  И после этого действие “list” передает данные, полученные из Модели, в Представление “list” которое в свою очередь использует цикл для отображения всех товаров.

Думаю, настало самое время для примеров кода, которые помогут легче усвоить все вышесказанное. Это и будет темой следующей статьи.

Постоянные читатели