Реализация mvc паттерна на примере создания сайта-визитки на php

Putting it all Together

Now that you have a better understanding of the layers involved in the MVC pattern, it’s time to see it in action with this tutorial’s sample app.

Open the tutorial’s sample project and run the app. This app is a WWDC-like app that shows sessions and attendees for the event. The app loads data from JSON files in the app bundle on launch. Loading the data triggers the controllers to update the view and begin waiting for user interaction.

To start, expand the Model folder. The three “pure” model classes are , and . Note how these conform to so parsing from a JSON response is simple.

From there, you have other model files that are part of your network calls. This tutorial’s project loads a file from the app’s bundle, but you can add a remote URL to load a file or call a web service. The main classes are:

  • Network: A wrapper around
  • NetworkError: To handle different errors during the request/response process
  • WebService: To add a helper method for loading both attendees and sessions

Of note is Network.swift, which has a method that uses generics to request JSON from a URL and parse it into an object type you specify in the method call. It handles HTTP responses and codes, errors, parsing, concurrency and making the call for you.

These files are small, straightforward, contain their own logic and you can test them with, at most, some mock methods.

Moving on to the view, it’s mostly contained in your storyboard files. This is a good thing as it’s not only more visual, but reducing the lines of code you write means reducing the amount of possible bugs you can introduce.

You may also have view logic in files, as is the case with SessionCell.swift, particularly when you do custom animations or UI elements. Your views should not know about business logic, interact with or know about model objects or do anything that doesn’t pertain to the view itself.

Testing components in the view layer, from a pure unit test perspective, is not so simple or useful, especially when dealing with XIBs or storyboards. This is because programmatically creating views or controllers will not trigger all methods in the view lifecycle or set up non-programmatic constraints. You can do UI testing and ensure that your tests also cover the view layer.

Finally, you get to the controller layer, this is where things get interesting as they act as the glue between view and model. and have the same concept. These display a list of items that you can select to view details. When you present the details for a selected item, you use the

Some things to note are:

  • The is in charge of loading the event data and then passing it to each of the controllers.
  • When the controller receives data, it triggers a reload of the table with the data.
  • The controllers act as the data source and delegate of the table view.
  • The controllers handle passing the details information when the user selects a session or event.

It’s all very lean, clean and easy to understand. You could even, for more robust projects, create separate classes or objects to act as data sources or delegates, further simplifying your controllers.

There is no heavy reliance on completion blocks, delegation (outside of what the table view needs) or mixing up business logic in views or controllers. You also don’t have the dreaded “MVC: massive view controllers.” This occurs when too much of your business logic lives inside of the controller.

Some tips to help you notice when an item in a layer may be overstepping its boundaries are:

  • The controller is doing network requests, parsing or persistence.
  • The controller (or any file) has hundreds or thousands of lines of code.
  • Views accept model objects to “configure” themselves or set up UI elements for display.
  • Controllers are doing a lot of business logic, calculations, data wrangling or manipulation.

Удаление записи в бд

И последнее элементарное действие с базой данных – удаление записей.

// модель
$model = new Model_Users();
// условие удаления
$select = array(
	'where' => 'id > 10'
// удаляем
$result = $model->deleteBySelect($select);
var_dump($result); // проверяем результат. Вернется количество удаленных строк

И еще один доступный вариант удаления, для одной записи:

// запрос
$select = array(
	'where' => 'id = 10'
// модель
$model = new Model_Users($select);
// извлекаем данные
// удаляем строку
$result = $model->deleteRow();

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


MVC состоит из трех компонент: View (представление, пользовательский интерфейс), Model (модель, ваша бизнес логика) и Controller (контроллер, содержит логику на изменение модели при определенных действиях пользователя, реализует Use Case). Основная идея этого паттерна в том, что и контроллер и представление зависят от модели, но модель никак не зависит от этих двух компонент. Это как раз и позволяет разрабатывать и тестировать модель, ничего не зная о представлениях и контроллерах. В идеале контроллер так же ничего не должен знать о представлении (хотя на практике это не всегда так), и в идеале для одного представления можно переключать контроллеры, а также один и тот же контроллер можно использовать для разных представлений (так, например, контроллер может зависеть от пользователя, который вошел в систему). Пользователь видит представление, на нем же производит какие-то действия, эти действия представление перенаправляет контроллеру и подписывается на изменение данной модели, контроллер в свою очередь производит определенные действия над моделью данных, представление получает последнее состояние модели и отображает ее пользователю.

Реализация в ASP.NET будет выглядит следующим образом (пример взят с MSDN ). Представление – это обычная aspx разметка:

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

Пример модели не самый удачный в данном случае, но все-таки не всегда бывает необходимость иметь действительно описанную бизнес модель в классах, иногда хватает и работы с DataSet’ами. Самое интересное, это реализация контроллера, по сути это code behind aspx страницы.

Данный подход даст нам возможность с легкостью написать тесты для модели, но не для контроллера (конечно же, все возможно, но придется постараться).


Представление реализовано в файлах ProjectView.xaml и ProjectView.xaml.cs:

Этот код создает простую форму, для отображения подробностей о проекте. Затем добавьте следующий код для ProjectsView.xaml.cs:

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

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

Самое интересное в моделе MVC, что обновление распространяется через представления. Выполните следующие шаги чтобы это увидеть:

  1. Выберите проект Jones в раскрывающемся списке ComboBox первого диалогового окна.

  2. Установите актуальную стоимость для него 1600.

  3. Щелкните кнопку Update в этом окне.

Вы должны увидеть автоматическое обновление представления во втором окне:

Можете поэкспериментировать с другими проектами или открыть еще несколько окон, при этом везде обновление представления будет работать так же. Итак, как видно MVC абстрагирует бизнес-логику от уровня представления, тем самым добиваясь легкой синхронизации пользовательского интерфейса. Я не буду рассматривать здесь модульное тестирование (еще один аспект использования паттернов) просто потому, что MVC больше подходит для веб-приложений, нежели для приложений WPF. Тестирование будет показано позже с использованием паттерна MVVM.

The View (V)

When users interacts with your app, they are interacting with the view layer. It should not contain any business logic. In code terms, you’ll normally see:

  • subclasses: These range from a basic to complex custom UI controls.
  • Classes that are part of UIKit/AppKit.
  • Core Animation.
  • Core Graphics.

Typical code smells found in this layer manifest in different ways but boil down to include anything unrelated to UI in your view layer. This can include network calls, business logic, manipulating models and so on.

Use the following as a checklist when inspecting your view layer:

  • Does it interact with the model layer?
  • Does it contain any business logic?
  • Does it try to do anything not related to UI?

If you answer “yes” to any of these questions, you have an opportunity to clean up and refactor.

Of course, these rules aren’t written in stone and sometimes you’ll need to bend them. Nonetheless, it’s important to keep them in mind.

Well-written view components are often reusable, but don’t focus on that from the start. It’s easy to get caught up in the thought of taking a cool button you built and making it compatible for a dozen different scenarios that your app may never need.

Consider making components reusable only when you actually need to. When you have multiple use cases, that’s the time to make a component more generic.

From a testing perspective, UI testing in iOS allows you to test things like transitions, UI elements having specific attributes or UI interactions working as intended.

What is MVC

With the project handy, it’s time to start learning about the Model, the View and the Controller. But first, what exactly is MVC?

Note: If you already know the concept of MVC, feel free to skip ahead to the next section, where you’ll start getting into best practices.

MVC is a software development pattern made up of three main objects:

  • The Model is where your data resides. Things like persistence, model objects, parsers, managers, and networking code live there.
  • The View layer is the face of your app. Its classes are often reusable as they don’t contain any domain-specific logic. For example, a is a view that presents text on the screen, and it’s reusable and extensible.
  • The Controller mediates between the view and the model via the delegation pattern. In an ideal scenario, the controller entity won’t know the concrete view it’s dealing with. Instead, it will communicate with an abstraction via a protocol. A classic example is the way a communicates with its data source via the protocol.

When you put everything together, it looks like this:

Each one of these objects is meant to be separate from the other, and each fulfills a specific role. When building an app that uses a specific pattern, in this case MVC, the goal is to adhere to the pattern when building all layers of your app.

Apple’s MVC documentation explains these layers in detail and can give you a good theoretical understanding. From a practical perspective, though, it falls a little short.

In this tutorial, you’ll learn to treat MVC as a pattern and not as a strict rule that you must never break. As is the case with many things in software development, nothing is perfect and neither is MVC. There are gray areas that you’ll run into, but no decision you make is the wrong decision. As long as you don’t have files that are too big, or code that is difficult to expand upon, then you’re likely doing a good job. Use MVC — and other patterns for that matter — as architectural guidelines and foundations for your app.

Having said that, it’s time to look at each layer in more detail.

Where to go From Here?

MVC is a pattern, a guideline for you to architect your app; it is not a strict set of rules you must adhere to.

As with anything that’s meant to act as a guide, you may disagree with some of the contents or implementations in this tutorial. You can do things in other ways or tweak it to fit your needs. That’s all fine. There are many ways to work with this dough that we call the model-view-controller pattern.

The TL;DR is: If you’ve found changes or tweaks that work for you, your team, your company or your workflow, go for it. As long as your app remains flexible and capable of growing, then you’re good to go.

No architecture, old or new, is a silver bullet and you should always focus on good engineering principles first.

If you have any comments or questions, please join the forum discussion below! I hope you’ve enjoyed this tutorial and learning a little bit more about the MVC pattern.

raywenderlich.com Weekly

The raywenderlich.com newsletter is the easiest way to stay up-to-date on everything you need to know as a mobile developer.

Injecting Strongly Typed ViewModels into the View using MVC

  1. The controller is responsible for newing up the ViewModel and injecting it into the View. (for get requests)
  2. The ViewModel is the container for DataContext and view state such as the last selected item etc.
  3. The Model contains DB entities and is very close to the DB Schema it does the queries and filtering. (I like EF and LINQ for this)
  4. The Model should also consider repositories and or projection of results into strong types (EF has a great method… EF.Database.Select(querystring, parms) for direct ADO access to inject queries and get back strong types. This addresses the EF is slow argument. EF is NOT SLOW!
  5. The ViewModel gets the data and does the business rules and validation
  6. The controller on post back will cal the ViewModel Post method and wait for results.
  7. The controller will inject the newly updated Viewmodel to the View. The View uses only strong type binding.
  8. The view merely renders the data, and posts events back to the controller. (see examples below)
  9. MVC intercepts the inbound request and routes it to proper controller with strong data type

In this model there is no more HTTP level contact with the request or response objects as MSFT’s MVC machine hides it from us.

In clarification of item 6 above (by request)…

Assume a ViewModel like this:

The controller method of the post will look like this (See below), note that the instance of mvm is automatically instanciated by the MVC binding mechanisms. You never have to drop down to the query string layer as a result! This is MVC instantiating the ViewModel for you based on the query strings!

Note that in order for this actionmethod above to work as you intend, you must have a null CTOR defined that intializes things not returned in the post. The post back must also post back name/value pairs for those things which changed. If there are missing name/value pairs the MVC binding engine does the proper thing which is simply nothing! If this happens you might find yourself saying «I’m losing data on post backs»…


Особенностью при использовании MVC в PHP, является то, что существует одна точка входа в php приложение, которая, например, достигается следующим образом. Создается index.php через который будут обрабатываться все запросы, для этого создаем в папке с индексом файл .htaccess и помещаем в него такой код:

RewriteEngine on 

RewriteCond %{REQUEST_FILENAME} !-f

RewriteCond %{REQUEST_FILENAME} !-d

RewriteRule ^(.*)$ index.php?route=$1 

В предоставленном коде, первой строкой, проверяется существование запрашиваемого файла, и если его нет, то идет перенаправление на index.php, иначе даже запросы картинок сайта будут перенаправляться на индекс. Последняя строка кода преобразовывает запросы вида index.php?route=chat/index у вид index.php/chat/index. Если у вас нет возможности использовать ModRewrite в своем приложении, то вам придется делать переадресацию вручную.

PHP Модель

Данные о PHP модели содержаться в ее атрибутах и могут быть изменены только через специальные функции. Модель может содержать в себе несколько представлений. Как правило, phpмодель это класс работающий с БД, конкретнее: запись, чтение, удаление. Естественно чтение информации с БД может быть реализовано несколькими представлениями (функциями). Как пример модель статей на сайте: можно получить конкретную статью из БД, список последних, популярных, какой-то категории… это все представления модели. Для наглядности ниже предоставлен пример php модели.


function methodName()


$link = mysql_connect(’localhost’, ‘mysql_user’, ‘mysql_password’);

if (!$link) {

die(’Could not connect: ‘ . mysql_error());


echo ‘Connected successfully’;


$query_results= mysql_query(’select * from searchNames order by firstname desc’);


$data = array();

while ($row = mysql_fetch_objects($query_results)) {

$data[] = $row;


return $data;



PHP контролер (Поведение)

PHP контролеры получают запросы пользователей, которые мы направляли через index.php, и в соответствии с ними, корректируют работу модели. Правильнее сказать контролируют работу php приложения.


$data= methodName();



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

Представление отслеживает изменение в модели и создает или меняет интерфейс php приложения.



<h1>List of Datas</h1>

<?php foreach ($data as $row) { ?>

<h2><?php echo $row->firstname ?></h2>

<h2><?php echo $row->lastname?></h2>

<?php } ?>



Как работает данный PHP MVC шаблон?

При обращении пользователем по нужному url выбирается соответственный контролер, который обращается к представлению и модели, и выводится информация. Другими словами контролер в mvc есть связующим звеном модели и представления.

Преимущества MVC шаблона при создании PHP приложения

Как упоминалось выше это, прежде всего дифференциация разработчиков php сайта на отделы. Также увеличивается скорость работы php приложения, если создается крупный проект. Ну и то, что касается непосредственно самого php разработчика, это правильная структуризация php кода (все на своих местах, так легче для понимания).

MVC пример

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

Еще одна схема работы MVC шаблона на PHP, она более чем доступна для понимания.

Дальше: Сворачивание и разворачивание блока на javascript

Особенности ASP.NET MVC. Что нового в MVC 5

Последнее обновление: 31.10.2015

Платформа ASP.NET MVC представляет собой фреймворк для создания сайтов и веб-приложений с помощью реализации паттерна MVC.

Концепция паттерна (шаблона) MVC (model — view — controller) предполагает разделение приложения на три компонента:

Контроллер (controller) представляет класс, обеспечивающий связь между пользователем и системой, представлением и хранилищем данных. Он получает вводимые пользователем данные и обрабатывает их. И в зависимости от результатов обработки отправляет пользователю определенный вывод, например, в виде представления.

Представление (view) — это собственно визуальная часть или пользовательский интерфейс приложения. Как правило, html-страница, которую пользователь видит, зайдя на сайт.


Общую схему взаимодействия этих компонентов можно представить следующим образом:

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

Благодаря этому реализуется концепция разделение ответственности, в связи с чем легче построить работу над отдельными компонентами. Кроме того, вследствие этого приложение обладает лучшей тестируемостью. И если нам, допустим, важна визуальная часть или фронтэнд, то мы можем тестировать представление независимо от контроллера. Либо мы можем сосредоточиться на бэкэнде и тестировать контроллер.

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

Свою реализацию паттерна представляет платформа ASP.NET MVC. 2013 год ознаменовался выходом новой версии ASP.NET MVC — MVC 5, а также релизом Visual Studio 2013, которая предоставляет инструментарий для работы с MVC5.

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

  • В MVC 5 изменилась концепция аутентификации и авторизации. Вместо SimpleMembershipProvider была внедрена система ASP.NET Identity, которая использует компоненты OWIN и Katana.

  • Для создания адаптивного и расширяемого интерфейса в MVC 5 используется css-фреймворк Bootstrap

  • Добавлены фильтры аутентификации, а также появилась функциональность переопределения фильтров

  • В MVC 5 также добавлены атрибуты маршрутизации

Это наиболее важные нововведения в MVC 5. Кроме того, есть еще ряд менее значимых, например, использование по умолчанию Entity Framework 6, некоторые изменения при создании проекта (концепция One ASP.NET), дополнительные компоненты и т.д.

В любом случае все полученные при работе с MVC 4 навыки можно успешно применять при использовании MVC 5, учитывая, конечно, нововведения.


Привязка массивов и коллекций

Стандартный связыватель модели включает неплохую поддержку для привязки данных запроса к массивам и коллекциям. Мы рассмотрим эти средства в последующих разделах.

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

Одной из элегантных возможностей стандартного связывателя модели является его поддержка параметров методов действий, которые представляют собой массивы. В целях демонстрации в контроллер Home добавлен новый метод по имени Names(), код которого показан в примере ниже:

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

Обратите внимание, что в этом примере внутри метода действия понадобится проверить значение параметра на предмет равенства null. Стандартными значениями для параметров могут быть только константы или литералы

В примере ниже приведено содержимое файла представления /Views/Home/Names.cshtml, который был создан для демонстрации привязки массива:

Это представление отображает разное содержимое на основе количества элементов в модели представления. Если элементы отсутствуют отображается форма, которая содержит три идентичных элемента <input>:

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

Привязка коллекций

Привязку можно осуществлять не только для массивов, но также и для классов коллекций .NET. В примере ниже показано, как изменить тип параметра метода действия Names(), чтобы он стал строго типизированным списком:

В примере ниже приведено модифицированное содержимое файла представления Names.cshtml, в котором применяется новый тип модели:

Функциональность действия Names не изменилась, но теперь можно работать с коллекцией, а не массивом.

Привязка коллекций специальных типов моделей

Индивидуальные свойства данных можно также привязывать к массиву специальных типов, такому как класс модели AddressSummary. В примере ниже видно, что мы добавили новый метод действия по имени Address, принимающий в качестве параметра строго типизированную коллекцию, которая полагается на специальный класс модели:

Для этого метода действия создан файл представления /Views/Home/Address.cshtml, содержимое которого показано в примере ниже:

Это представление визуализирует элемент <form>, если элементы в коллекции модели отсутствуют. Элемент <form> состоит из пары элементов <input>, атрибуты name которых имеют префиксы в виде индекса массива в результирующей HTML-разметке:

Когда форма отправляется, стандартный связыватель модели определяет, что необходимо создать коллекцию объектов AddressSummary, и использует префиксы индексов массива в атрибутах name для получения значений, предназначенных для свойств этих объектов. Свойства с префиксом применяются для первого объекта AddressSumary, свойства с префиксом — для второго объекта AddressSumary и т.д.

Представление Address.cshtml определяет элементы <input> для трех таких индексированных объектов и отображает их в ситуации, когда коллекция модели содержит элементы. Перед тем, как это можно будет продемонстрировать в работе, необходимо удалить атрибут Bind из класса модели AddressSummary, как показано в примере ниже, иначе связыватель модели проигнорирует свойство Country:

Чтобы просмотреть результаты работы процесса привязки для коллекций специальных объектов, понадобится запустить приложение и перейти на URL вида /Home/Address. Введите значения в полях для городов и стран, после чего щелкните на кнопке «Отправить», чтобы отправить форму серверу. Связыватель модели найдет и обработает индексируемые значения данных и применит их для создания коллекции объектов AddressSummary, а затем передаст их обратно представлению для отображения:

Step 4

Use the StudentController methods to demonstrate MVC design pattern usage.


public class MVCPatternDemo {
   public static void main(String[] args) {

      //fetch student record based on his roll no from the database
      Student model  = retriveStudentFromDatabase();

      //Create a view : to write student details on console
      StudentView view = new StudentView();

      StudentController controller = new StudentController(model, view);


      //update model data


   private static Student retriveStudentFromDatabase(){
      Student student = new Student();
      return student;

Наиболее частые ошибки

Начинающие программисты очень часто трактуют архитектурную модель MVC как пассивную модель[неизвестный термин] MVC: модель выступает исключительно совокупностью функций для доступа к данным, а контроллер содержит бизнес-логику. В результате — код моделей по факту является средством получения данных из СУБД, а контроллер — типичным модулем, наполненным бизнес-логикой. В результате такого понимания — MVC-разработчики стали писать код, который Pádraic Brady (известный в кругах сообщества «Zend Framework») охарактеризовал как «ТТУК» («Толстые, тупые, уродливые контроллеры»; Fat Stupid Ugly Controllers):

Но в объектно-ориентированном программировании используется[кем?] активная модель[неизвестный термин] MVC, где модель — это не только совокупность кода доступа к данным и СУБД, но и вся бизнес-логика; также, модели могут инкапсулировать в себе другие модели. Контроллеры же, — как элементы информационной системы, — ответственны лишь за:

  • приём запроса от пользователя;
  • анализ запроса;
  • выбор следующего действия системы, соответственно результатам анализа (например, передача запроса другим элементам системы).

Только в этом случае контроллер становится «тонким» и выполняет исключительно функцию связующего звена (glue layer) между отдельными компонентами информационной системы.

Условно-обязательные модификации

Для реализации схемы «Model-View-Controller» используется достаточно большое число шаблонов проектирования (в зависимости от сложности архитектурного решения), основные из которых — «наблюдатель», «стратегия», «компоновщик».

Наиболее типичная реализация — в которой представление отделено от модели путём установления между ними протокола взаимодействия, использующего «аппарат событий» (обозначение «событиями» определённых ситуаций, возникающих в ходе выполнения программы, — и рассылка уведомлений о них всем тем, кто подписался на получение): при каждом особом изменении внутренних данных в модели (обозначенном как «событие»), она оповещает о нём те зависящие от неё представления, которые подписаны на получение такого оповещения — и представление обновляется. Так используется шаблон «наблюдатель».

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

Для возможности однотипного обращения с подобъектами сложно-составного иерархического вида — может использоваться шаблон «компоновщик». Кроме того, могут использоваться и другие шаблоны проектирования — например, «фабричный метод», который позволит задать по умолчанию тип контроллера для соответствующего вида.


Концепция MVC была описана Трюгве Реенскаугом в 1978 году, работавшем в научно-исследовательском центре «Xerox PARC» над языком программирования «Smalltalk». Позже, Стив Бурбек реализовал шаблон в Smalltalk-80.

Окончательная версия концепции MVC была опубликована лишь в 1988 году в журнале .

Впоследствии шаблон проектирования стал эволюционировать. Например, была представлена иерархическая версия HMVC; , MVVM.

Дальнейший виток популярности привнесло развитие фреймворков, ориентированных на быструю развёртку, на языках Python, PHP и Ruby: Django, Laravel и Ruby on Rails соответственно. На момент 2017 года, фреймворки с MVC заняли заметные позиции по отношению к остальным фреймворкам без этого шаблона.


Основная цель применения этой концепции состоит в отделении бизнес-логики (модели) от её визуализации (представления, вида). За счёт такого разделения повышается возможность повторного использования кода. Наиболее полезно применение данной концепции в тех случаях, когда пользователь должен видеть те же самые данные одновременно в различных контекстах и/или с различных точек зрения. В частности, выполняются следующие задачи:

  1. К одной модели можно присоединить несколько видов, при этом не затрагивая реализацию модели. Например, некоторые данные могут быть одновременно представлены в виде электронной таблицы, гистограммы и круговой диаграммы;
  2. Не затрагивая реализацию видов, можно изменить реакции на действия пользователя (нажатие мышью на кнопке, ввод данных) — для этого достаточно использовать другой контроллер;
  3. Ряд разработчиков специализируется только в одной из областей: либо разрабатывают графический интерфейс, либо разрабатывают бизнес-логику. Поэтому возможно добиться того, что программисты, занимающиеся разработкой бизнес-логики (модели), вообще не будут осведомлены о том, какое представление будет использоваться.

MVC Components

Following are the components of MVC −


The Model component corresponds to all the data-related logic that the user works with. This can represent either the data that is being transferred between the View and Controller components or any other business logic-related data. For example, a Customer object will retrieve the customer information from the database, manipulate it and update it data back to the database or use it to render data.


The View component is used for all the UI logic of the application. For example, the Customer view will include all the UI components such as text boxes, dropdowns, etc. that the final user interacts with.


Controllers act as an interface between Model and View components to process all the business logic and incoming requests, manipulate data using the Model component and interact with the Views to render the final output. For example, the Customer controller will handle all the interactions and inputs from the Customer View and update the database using the Customer Model. The same controller will be used to view the Customer data.

С этим читают