Mvc что это
Перейти к содержимому

Mvc что это

  • автор:

MVC для веб: проще некуда

В этой статье мы рассмотрим архитектурный паттерн MVC (Model, View, Controller) в применении к веб-разработке, «в чистом виде», без привлечения каких-то дополнительных, не относящихся к MVC структур и паттернов. Мы будем продвигаться от простого к сложному, поэтому пока не станем рассматривать, например, дальнейшее развитие MVC – паттерн HMVC (Hierarchical MVC). Хотя HMVC, несомненно, намного более интересен для разработки веб-приложений, но его применение не отменяет необходимости понимания «обычного» MVC.

Статья в Википедии (а именно туда, видимо, чаще всего попадают те, кто только начинает изучать MVC), изобилует неточностями и туманными формулировками, само определение, по сути, является неверным, а приведенная схема просто напросто не соответствует той, которая применяется в веб вообще и при разработке на PHP – в особенности.

Наиболее корректное определение паттерна MVC я обнаружил тут:

Шаблон проектирования MVC предполагает разделение данных приложения, пользовательского интерфейса и управляющей логики на три отдельных компонента: Модель, Представление и Контроллер – таким образом, что модификация каждого компонента может осуществляться независимо.

Уточним, что термин «компонент» в данном случае не имеет никакой связи с компонентами некоторых популярных CMS или фреймворков, а компоненты Битрикса, например вообще строятся из всех трёх составляющих MVC.
В приведённом определении под компонентом следует понимать некую отдельную часть кода, каждая из которых играет одну из ролей Контроллера, Модели или Представления, где Модель служит для извлечения и манипуляций данными приложения, Представление отвечает за видимое пользователю отображение этих данных (то есть, в применении к вебу, формирует отдаваемый сервером браузеру пользователя HTML/CSS), а Контроллер управляет всем этим оркестром.

Давайте рассмотрим классическую схему веб-приложения:

Рисунок 1

На этом и последующем рисунках пунктирными линиями показана управляющая информация (такая, например, как ID запрашиваемой записи блога или товара в магазине), а сплошными – собственно данные приложения (которые могут храниться в БД, или в виде файлов на диске, или даже, возможно, в оперативной памяти – этот вопрос лежит за пределами паттерна MVC). В применении к вебу запрос и ответ ходят по HTTP, поэтому можно условно считать, что на этом рисунке пунктиром обозначены заголовки HTTP-запроса и ответа, а сплошными линиями – их тела.

Получив Запрос 1, Контроллер его анализирует, и в зависимости от результатов обработки может выдать следующие варианты ответа (почему ответ имеет номер 4, станет понятно из следующих рисунков):

1. Сразу выдать ответ об ошибке (например, при запросе несуществующей страницы отдать только HTTP-заголовок «404 Not found»)

2. Если поступивший Запрос 1 признан корректным, то, в зависимости от того, является он запросом на просмотр или на модификацию данных, Контроллер вызывает соответствующий метод Модели, такой как Save или Load (Запрос 2 на Рис.2).

Рисунок 2

Важное замечание: концепция MVC не только не привязана к какому-то конкретному языку программирования, она также не привязана и к используемой парадигме программирования. То есть, вы вполне можете проектировать своё приложение по MVC, при этом не применяя ООП, и спроектировать Модель Товар для интернет-магазина таким образом:

 // возвращает ассоциативный массив с данными о Товаре либо FALSE при неудаче bool Product_Save (array $data) < . >// возвращает TRUE при удачном сохранении данных $data, либо FALSE при неудаче ?> 

Итак, в зависимости от полученного от Модели Ответа 2 Контроллер решает, какое из Представлений вызвать для формирования итогового ответа на изначальный Запрос 1:

3.1. В случае неудачи – Представление для сообщения об ошибке
3.2. В случае успеха – Представление для отображения запрашиваемых данных либо сообщения об их успешном сохранении (если Запрос 1 был на изменение данных).

Рисунок 3

Вопрос о том, кто должен проверять на валидность и права доступа входные данные (Контроллер или Модель), является предметом достаточно многочисленных споров, поскольку паттерн MVC не описывает таких деталей. Это значит, что в этом вопросе выбор за вами (или за вас его сделали авторы вашего любимого фрейvворка или CMS).
Мы в своей практике придерживаемся такого подхода:
Контроллер проверяет входные данные на предмет «общей» (т.е. независящей от конкретного запроса) корректности, соответствие требованиям Модели к валидности сохраняемых данных проверяет соответствующий метод Модели, а права доступа – метод Access отдельного класса User.

Для вызова Представления в PHP иногда проектируется специальный класс (а то и несколько классов), например, View (это часто встречается в описаниях MVC в реализации того или иного фреймворка), однако это не является требованием MVC.
Также файлы Представлений часто называют шаблонами, а при использовании так называемых шаблонизаторов роль Представления играет сам шаблонизатор, а шаблоны (т.е. файлы, содержащие непосредственно HTML-разметку) в некоторых фреймворках называют layouts.

Не вполне понятен предыдущий абзац? Забейте, поскольку у нас каждое Представление – это просто отдельный PHP-файл, а сам PHP устроен так, что в случае, если мы используем для выполнения Запроса 3 инструкцию include, Ответ 3 и Ответ 4 (помните, что это ответ на Запрос 1?) отдаются браузеру автоматически, средствами самого PHP.

Давайте рассмотрим пример.

У нас есть два варианта Представления (шаблоны), в которых

будет означать HTML-код, предворяющий в формируемом веб-документе основной контент (т.е. содержит тег doctype, контейнер head, код шапки страницы, и т.п.), а – примерно то же, только для подвала страницы.

Листинг 1. Шаблон product.tpl.php отображает данные о Товаре (которые к моменту его вызова уже содержит объект $product):
  

Title;?>

Цена:Price;?>

Description;?>

Листинг 2. Шаблон error.tpl.php отображает сообщение об ошибке (которое содержится в переменной $error):
  Ошибка:
Листинг 3. Контроллер product.php, служащий для отобоажения Товара, будет выглядеть примерно так:
 if (!$id = . ) // проверка "общей" валидности Запроса 1 error(. ); // проверка прав доступа if (!$user->Access(. )) error(403); if (!$product = Product::Load($id)) // Запрос 2 и анализ Ответа 2 error('Тут скорее всего случилась ошибка БД'); include 'product.tpl.php'; // Запрос 3 и Ответы 3 и 4 ?> 

Те, кто любит красивый и оптимизированный код могут заметить, что блоки HTML.header и HTML.footer дублируются в обоих шаблонах (они же Представления) error.tpl.php и product.tpl.php, и наверняка захотят вынести их в Контроллер product.save.php:

…. и нарушить таким образом основное правило MVC – разделяйте Контроллер, Модель и Представление.

Тем не менее, дублирующийся код – однозначное Зло. Что же делать?
Мы должны перейти от MVC к HMVC!
Но это – тема отдельной статьи.

Что такое MVC: рассказываем простыми словами

Что такое MVC: рассказываем простыми словами главное изображение

Современные сайты интерактивные и динамичные — они реагируют на действия пользователя, обрабатывают его запросы и выдают результат. Так работают многие онлайн-сервисы, например, интернет-банкинги или онлайн-кинотеатры. Для создания интерактивных и динамичных сайтов обычно используется архитектурный паттерн MVC. Рассказываем простыми словами, в чем суть этой модели.

  • Что такое модель MVC: теория
  • Разбираем MVC на примере магазина сэндвичей
  • Паттерн MVC в реальной веб-разработке: как работает контроллер
  • Модель
  • Представление
  • Заключение

Что такое модель MVC: теория

Статическая страница на HTML не умеет реагировать на действия пользователя. Для двухстороннего взаимодействия нужны динамические веб-страницы. MVC — ключ к пониманию разработки динамических веб-приложений, поэтому разработчику нужно знать эту модель.

MVC расшифровывается как «модель-представление-контроллер» (от англ. model-view-controller). Это способ организации кода, который предполагает выделение блоков, отвечающих за решение разных задач. Один блок отвечает за данные приложения, другой отвечает за внешний вид, а третий контролирует работу приложения.

Fullstack-разработчик — с нуля до трудоустройства за 16 месяцев

  • Постоянная поддержка от наставника и учебного центра
  • Помощь с трудоустройством
  • Готовое портфолио к концу обучения
  • Практика с первого урока

Вы получите именно те инструменты и навыки, которые позволят вам найти работу

  • Модель — этот компонент отвечает за данные, а также определяет структуру приложения. Например, если вы создаете To-Do приложение, код компонента model будет определять список задач и отдельные задачи.
  • Представление — этот компонент отвечает за взаимодействие с пользователем. То есть код компонента view определяет внешний вид приложения и способы его использования.
  • Контроллер — этот компонент отвечает за связь между model и view . Код компонента controller определяет, как сайт реагирует на действия пользователя. По сути, это мозг MVC-приложения.

Разбираем MVC на примере магазина сэндвичей

Мы уже рассматривали работу с вложенными коллбэками на примере приготовления гамбургеров. Продолжаем традицию: разберем паттерн MVC на примере магазина сэндвичей.

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

У поваров под рукой есть разные продукты: тунец, индейка, ветчина, сыр, листья салата и другие ингредиенты, которые добавляют в бутерброды. Они выбирают только то, что нужно для вашего сэндвича с индейкой. Вы получаете свой заказ.

Покупку бутерброда можно описать через MVC:

  • Модель: кухня, на которой повар делает сэндвич
  • Представление: готовый бутерброд, который вы с удовольствием едите
  • Контроллер: продавец или бармен, который принимает заказ и передаёт его на кухню.

Схема MVC

Вы уже представляли готовый сэндвич с индейкой, когда заказывали его бармену. Это представление или view .

Точно так же можно представить взаимодействие с сайтом. Когда вы заходите на сайт Хекслета и переходите по ссылке «Истории успеха», то заранее представляете результат перехода по ссылке. Это список текстов с историями ребят, которые учились на Хекслете, а потом стали разработчиками.

Когда вы нажимаете на ссылку «Истории успеха», на наш сервер уходит запрос. В нём содержится просьба показать вам список текстов. Это очень похоже на просьбу продать вам бутерброд с индейкой. Это контроллер.

На сервере Хекслета ваш запрос обрабатывается. Программа достаёт из базы данных все последние тексты из рубрики «Истории успеха», чтобы показать список. Это можно сравнить с кухней и поварами из примера с сэндвичем. Это модель.

Сервер Хекслета берёт нужные ингредиенты из базы данных и готовит ваш заказ: список текстов. Тем же занимались повара на кухне магазина сэндвичей. Это снова представление или view .

Паттерн MVC в реальной веб-разработке: как работает контроллер

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

 возвращает profilewebsite(.)com/friends/ -> возвращает friendswebsite(.)com/friend=/ -> возвращает профиль конкретного друга 

Модель

Модель отвечает за данные, которые хранятся и обрабатываются на сервере.

, friends > 

Представление

Это HTML-шаблон, который возвращает сервер после обработки запроса. Если запрос корректно обрабатывается, вы получаете веб-страницу со списком друзей. Если запрос некорректный, вы попадаете на страницу ошибки 404.

Заключение

MVC — подход к проектированию приложения, который предполагает выделение кода в блоки типов модель, представление и контроллер. Контроллер обрабатывает входящие запросы. Модель достаёт из базы данных информацию, нужную для выполнения конкретных запросов. Представление определяет результат запроса, который получает пользователь.

Профессия «Fullstack-разработчик»

  • Станьте специалистом полного цикла и создавайте веб-приложения с нуля
  • Научитесь верстать страницы в HTML и CSS
  • Изучите фронтенд-разработку на JavaScript
  • Освойте платформу Node.JS и соберите весь бэкенд с ее помощью

Что такое MVC: базовые концепции и пример приложения

Объясняем, что такое паттерн MVC и как он помогает упростить разработку.

Евгений Кучерявый

Евгений Кучерявый

Пишет о программировании, в свободное время создаёт игры. Мечтает открыть свою студию и выпускать ламповые RPG.

MVC — это шаблон программирования, который позволяет разделить логику приложения на три части:

  • Model (модель). Получает данные от контроллера, выполняет необходимые операции и передаёт их в вид.
  • View (вид или представление). Получает данные от модели и выводит их для пользователя.
  • Controller (контроллер). Обрабатывает действия пользователя, проверяет полученные данные и передаёт их модели.

Может показаться, что это что-то запутанное, но на самом деле всё просто.

Как работает MVC

Лучше всего понять концепцию MVC можно на реальном примере — ресторане с фастфудом. В нём посетители (пользователи) подходят к кассиру (одновременно вид и контроллер), видят меню и заказывают какое-нибудь блюдо.

Кассир проверяет, всё ли в порядке с заказом, и после оплаты передаёт нужные данные повару (модель). Повар готовит заказанное блюдо, хотя понятия не имеет о том, как выглядит посетитель, оплатил ли он заказ и так далее.

Когда модель закончит свою работу, она отправит результат в вид — обратно кассиру, который, в свою очередь, отдаст готовое блюдо посетителю.

Если же говорить о приложениях, то компоненты будут следующие:

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

Стоит также отметить, что реализация паттерна MVC может отличаться в зависимости от задачи. Например, в веб-разработке модель и вид взаимодействуют друг с другом через контроллер (как в примере с рестораном), а в приложениях модель может сама уведомлять вид, что нужно что-то изменить.

Зачем программистам нужен MVC

Этот паттерн разработки нужен для того, чтобы разделить логические части приложения и создавать их отдельно друг от друга. То есть писать независимые блоки кода, которые можно как угодно менять, не затрагивая другие.

Например, чтобы можно было переписать способ обработки данных, не меняя при этом способ их отображения. Это позволяет эффективно работать нескольким программистам — каждый занимается своим компонентом. При этом разработчику не нужно вникать в чужой код и его действия никак не повлияют на другие фрагменты приложения.

Независимым программистам MVC тоже будет полезен, потому что они смогут сосредоточиться на разработке одного компонента за раз.

Практика: пишем
MVC-приложение

Чтобы лучше вникнуть в этот паттерн, стоит применить его на практике. Для этого создайте WPF-приложение и сверстайте такую форму:

Заключение

На первый взгляд MVC может показаться сложным, но чем больше усилий уделять на его изучение, тем понятнее будет, почему многие разработчики предпочитают именно его. Особенно если сравнивать его с обычной разработкой, где за всё отвечают обработчики событий.

Читайте также:

  • Как работает .NET и зачем он нужен
  • GNU Emacs: как текстовый редактор из 1980-х учит программистов ценить свободное ПО
  • Перечисления в C#: как правильно использовать enum

Что такое модель MVC?

В этой статье поговорим про архитектуру программного обеспечения. Расскажем о том, что такое модель MVC, зачем нужен этот архитектурный паттерн в разработке, что такое контроллер в MVC и т. д. Постараемся объяснить все на примере и простыми словами.

Процесс взаимодействия пользователя и веб-сайта основан на постоянной обработке пользовательских запросов и выдаче соответствующих результатов. Любой интернет-сервис, будь то онлайн-кинотеатр, социальная сеть или интернет-банкинг, реагирует на действия пользователя довольно быстро. Чтобы обеспечить нужный уровень интерактивности и динамичности, в архитектуре ПО используют специальный паттерн под названием MVC. Что же такое модель MVC и в чем суть?

Немного теории

Модель MVC представляет собой шаблон программирования, позволяющий делить логику программного приложения на 3 части. Расшифровка аббревиатуры довольно проста:

  • M — Model (Модель). Model получает данные от контроллера, осуществляет выполнение нужных операций, а потом передает данные во View;
  • V — View (Вид, Представление). View получает данные от Model с последующим выводом их для пользователя;
  • C — Controller (Контроллер). Контроллер в MVC — это блок, обрабатывающий действия пользователя и проверяющий полученную информацию, которая затем передается в Model.

Вот такой вот круговорот. Можно подумать, что все запутано, но на деле это не так.

Таким образом, модель MVC — это особый способ организации кода, предполагающий выделение блоков, каждый из которых будет отвечать за решение своих задач. Один отвечает за данные программного приложения, другой — за внешний вид, третий — за работу приложения. В этом контексте компоненты можно описать следующим образом:

  • Модель — отвечает за данные, определяет структуру программного приложения;
  • Представление — обеспечивает взаимодействие с пользователем. Определяет внешний вид программного приложения, а также способы его использования;
  • Контроллер — это компонент, отвечающий в паттерне MVC за связь между Моделью и Представлением. Его код определяет, как веб-сайт реагирует на действия пользователя. Можно назвать этот блок мозгом приложения.

Контроллеры (controllers), Модели (models), Представления (views) в MVC — это все хорошо, но как лучше понять вышесказанную скучную теорию? Правильно, описать ее на абстрактном примере из реальной жизни. Пусть это будет заведение быстрого питания.

Паттерн MVC и магазин быстрого питания

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

Как вся эта ситуация будет выглядеть в контексте паттерна MVC:

  • Model — это кухня, где повара готовят вам сэндвич (там происходит обработка вашего запроса);
  • View — это готовый сэндвич, который вы видите, держите в руках и с аппетитом кусаете;
  • Controller — это продавец за стойкой, принимающий ваш запрос и передающий заказ на кухню.

Теперь представьте, что вы зашли в социальную сеть «ВКонтакте». Когда вы в качестве пользователя переходите по ссылке «Сообщества», вы автоматически отправляете запрос (вспоминаем продавца и Контроллер) с пожеланием открыть свои сообщества («хочу сэндвич с индейкой»). Ваш запрос обрабатывается на сервере (на кухне, то есть в Model), в результате чего из базы данных «достаются» сообщества, на которые вы подписаны. Все это происходит практически мгновенно — быстрее, чем в реальности готовят сэндвич. Итог — открывается соответствующая веб-страница, где отображается список всех ваших сообществ, то есть вы получаете свой сэндвич, он перед вами, вы его видите (View). Обратите внимание, что открывается именно страница (сэндвич) с сообществами (с индейкой), а не с друзьями (тунцом) или новостями (ветчиной).

  • Продавец = Контроллер. Он хорошо знаком с меню и передает запросы на кухню;
  • Кухня = Model. Повара знают, какие надо выбрать ингредиенты, что на каких полках лежит, как приготовить блюдо, чтобы результат соответствовал ожиданиям пользователя;
  • Сэндвич = Представление. Это итоговый продукт, который пользователь сначала заказал, а потом получил.

Вывод прост и логичен: когда речь идет о функционировании сложной и большой системы, ее лучше разбить на модули. Именно для этого и существует вышеописанная модель разработки ПО.

Pattern в реальной разработке

С помощью вышеописанной архитектуры написан код ниже.

Controller

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

Model

Отвечает за данные, хранимые и обрабатываемые на сервере.

View

Это уже HTML-шаблон, возвращаемый сервером после обработки реквеста. При корректной обработке вы получите нужную веб-страницу (в примере — это список друзей). Если что-то пойдет не так, результатом станет ошибка 404.

Каков профит?

Мы рассмотрели подход к проектированию и созданию программных приложений, предусматривающий выделение кода в такие компоненты, как Модель, Представление и Контроллер. Controller в паттерне MVC — это такой компонент, который служит для обработки входящих запросов. Модель извлекает из БД необходимую информацию. Представление определяет визуальный результат.

Основная цель следования таким принципам — разделение реализации бизнес-логики от ее визуализации. Это повышает возможности повторного применения кода, повышает его читаемость, упрощает написание программ, облегчает расширение и техническую поддержку системы в будущем.

  • https://ru.hexlet.io/blog/posts/chto-takoe-mvc-rasskazyvaem-prostymi-slovami;
  • https://javarush.ru/groups/posts/2536-chastjh-7-znakomstvo-s-patternom-mvc-model-view-controller;
  • https://skillbox.ru/media/code/chto_takoe_mvc_bazovye_kontseptsii_i_primer_prilozheniya/.

Также вам могут быть интересны следующие статьи с примерами реализации MVC на PHP:

  • «Модель проектирования MVC — что это? PHP и MVC »;
  • «Пример шаблона проектирования MVC в PHP ».

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *