Основы архитектуры MVC. Часть вторая. Соглашения.

В прошлой статье я начал рассказывать о основах архитектуры MVC. Я рассказал о Модели, Контроллере и Представление: их конкретных функциях и соотношении друг с другом. Это основа архитектуры MVC, однако перед тем как переходить к примерам кода я хотел бы рассказать о соглашениях рекомендуемых для программирования под Yii.



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


Каждый компонент MVC располагается в отдельном файле, или в случае с представлениями, в нескольких файлах. В случае с Товар-Категория мы будем иметь компоненты MVC для Товаров и компоненты MVC для Категорий отдельно. На сервере компоненты группируются по типу компонентов а не по имени. Другими словами папка models содержит файл модели для товаров и файл модели для категорий; папка controllers содержит файл контроллера для товаров и файл контроллера для категорий; тоже самое и для папки views с тем исключением что для каждого действия может присутствовать свой файл представления. В Yii файлы Моделей должны быть вида ModelName.php, например Goods.php. В соответствие с соглашением имена файлов должны состоять из одного слова. В каждом файле должен быть определен один класс который является моделью. Имя класса соответствует имени файла минус расширение: Goods для модели Goods.php.


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


Если Модель основана на таблице БД, таблица должна иметь тоже имя что и Модель (Goods для Модели товаров) . Yii требует первичный ключ с именем id для таблицы (имя может быть другим в различных фрэмворках). Большинство фрэймворков позволяет изменить стандартное поведение модели, например изменить связь между именем таблицы и именем класса но при разработке лучше всего придерживаться соглашений установленных фрэймворком. Вы можете добавить код для описания нестандартного поведения Модели но это дополнительная работа и может легко привести к ошибкам.


Для большинства Моделей необходим Контроллер (не всегда, вы можете иметь Контроллер не связанный с Моделью или Модель не имеющую своего Контроллера). Файлы Контроллеров обычно хранятся в папке controllers. В Yii имена Контроллеров имеют вид NameController.php (например GoodsController.php для Контроллера Goods).


В классе Контроллера методы описывают возможные действия. В примере с товарами возможные следующие действия: create (создать), update(обновить), delete(удалить), list(список), show(отобразить товар отдельно) и т.д. В Yii методы отвечающие за действия должны иметь имя вида: actionДействие. Например: actionCreate(), actionDelete(), actionList(), actionShow() и т.д. Обратите внимание что действие должно начинаться с большой буквы. Каждый метод (функция) определяет что должно происходить при вызове этого действия.


(В качестве небольшого отступления я бы хотел рассказать о том как URL адрес вызывает действие. Большинство фрэймворков обрабатывает строку URL так чтобы она выглядела более чистой и дружественной. Фрэймворки обычно используют один файл обработчик (обычно index.php) которые обрабатывают запрос пользователя и направляют трафик по нужному пути. Например вместо того чтобы увидеть www.example.com/index.php?controller=goods&action=list , пользователь увидит www.example.com/index.php/goods/list . Этот URL просто сообщает о том что приложение должно выполнить действие list в Контроллере Goods. Этот способ достаточно прост и элегантен. )


Третий компонент MVC это Представление (View) который содержит отображение страницы. Файлы прдставлений находятся в папке views. Большинство фрэймворков разделяют директорию view на поддиректории по категориям: отдельная папка для товаров (goods) и отдельная для категорий (category). Для каждой задачи обычно существует отдельный файл Представления для каждого действия: show (для отображения отдельного товара), list (для отображения списка), create (для добавления товара) и update (для обновления существующего товара). В Yii эти файлы имеют имена create.php, show.php, list,php, update.php и create.php, плюс файл _form.php (один файл содержащий форму как для добавления так и для редактирования товара).


Также существует ещё один файл Представления: макет (layout). Этот файл (или несколько файлов так как один сайт может содержать несколько макетов) устанавливает общий шаблон: открвыает тэги HTML, подключает файлы CSS и JavaScript, создает заголовки, навигацию, футер и закрывает HTML тэг. Содержание отдельных файлов Представления размещается внутри этого файла макета. Таким образом для изменения какого то одного общего элемента (например навигации) требуется изменить только один файл. Yii содержит файл макета в views/layouts/main.php . Как вы узнаете, вы сможете спокойно изменять макет используя добавление кода в Контроллер.


Ну вот вроде бы и все что касается соглашений о структуре директорий, имен файлов, и имен классов/методов. Получилось достаточно длинно но я считаю что очень важно усвоить это до того как приступать к написанию кода. В следующей статье я приведу несколько примеров кода для каждого компонента MVC.



Основы архитектуры 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” которое в свою очередь использует цикл для отображения всех товаров.

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

Тестовая запись

Проверка связи

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