[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Курс "MVC от теории к практике"
Alehandr
Общие понятия и концепция паттерна MVC

Всем здраствуйте!!!
Вот и пришло время первой лекции нашего курса. Приступим...

Что говорит нам википедия:

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

Шаблон MVC позволяет разделить данные, представление и обработку действий пользователя на три отдельных компонента
  • Модель (Model). Модель предоставляет данные (обычно для View), а также реагирует на запросы (обычно от контроллера), изменяя свое состояние.
  • Представление (View). Отвечает за отображение информации (пользовательский интерфейс).
  • Поведение (Controller). Интерпретирует данные, введенные пользователем, и информирует модель и представление о необходимости соответствующей реакции.


user posted image

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

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


В чем же отличия:

Главное отличие веб-разработок от разработки простого ПО то, что Представление (в конечном ее виде) не может напрямую взаимодействовать с остальной составляющей (ajax может частично это компенсировать). Поэтому схема MVC для интернет приложений принимает совершенно другой вид: модель и контроллер тесно взаимосвязаны и формируют представление, в конечном итоге вывод информации пользователю. Обычно в роли Представления выступают разнообразные шаблонизаторы, которые просто собирают информацию и формируют вывод.


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

MVC, если в нем как следует разобраться, паттерн отличнейший и хорошо подходит для рабработки веб сайтов.
Самое сложное в нем, написать хороший Router. Router - это так сказать сердце MVC. Его основной задачей является определение Контроллера, на который следует возложить ответственность по обработке запроса пользователя. После того, как Роутер определит объект Контроллера и необхадимую для вызова функцию, контроллер собирает необходимую информацию (взаимодествуя с Моделью(ми)) передает ее на вывод, используя или нет то либо иное Представление...


Что же у нас в итоге получается?

1. При запросе пользователя к сайту Router определяет необходимый Controller и его метод.
2. Controller собирает необходимую информацию (возможно взаимодействуя с моделью)
3. Controller выводит информацию пользователю (возможно используя представление)

Хм, получается, что впринципе мы можем использовать только Router и разные Controller'ы, без моделей и представлений... Но такой расклад пойдет только для сайтов без использования баз данных и всевозможных наворотов для конечного пользователя, либо же нам придется как всегда шариться в куче непонятного когда не разложенного по полочкам...


Зачем нам нужны модели и представления:

Сначала о моделях (не о тех, что по подиумам ходят). Модели - обычно это чтото вроде прокладки между Базой Данных и муторными запросами. Если кому интересно, почитайте о ORM. Основные задачи, возложенные на Модели - это хранение и обработка информации. Преимущество - меньше мусора в основном коде...

Представления - это те-же шаблонизаторы, наипростейшим из которых является минимальный php код совместно с html. Использование представлений дает большое преимущество, программистам не надо парить и писать html где попало в коде, а дизайнерам и верстальщикам искать где и что нужно добавить или отредактированть...



Итоги:

Надеюсь мне удалось объяснить основную концепцию данного патерна. Знаю, что еще много чего вам не понятно, но терпение господа, еще все впереди...



Задание до следующей лекции:
  • Изучить паттерны Observer и Singleton (они не такие уж и сложные)




P.S.: Кому что не понятно, пишите...



Спустя 13 минут, 51 секунда (21.11.2009 - 15:13) Joker написал(а):
Чот я не врубился)))

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


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

Спустя 4 минуты, 32 секунды (21.11.2009 - 15:18) Alehandr написал(а):
Joker
1:
Цитата
Модели - обычно это чтото вроде прокладки между Базой Данных и муторными запросами. Если кому интересно, почитайте о ORM. Основные задачи, возложенные на Модели - это хранение и обработка информации. Преимущество - меньше мусора в основном коде...

Что не понятно то?

2: Практика будет дальше...

Спустя 17 секунд (21.11.2009 - 15:18) Joker написал(а):
А еще, когда ведут курсы узучать что самим редко очень при очень редко дают что то самим ну ведь на то они и курсы чтоб научили и показали как делается. А то вон попов напишет коряво про эти сиглы миглы а я его прочитаю и буду с табой спорить что ты не так их используешь а прав буду я т.к. ты сам отослал меня учить в левом месте. и даже не дал сылочку на провереный достоверный материал.

Спустя 1 минута, 45 секунд (21.11.2009 - 15:20) Joker написал(а):
Цитата (Alehandr @ 21.11.2009 - 18:18)
Что не понятно то?


Что за прокладка как она дейсвует да и слово прокладка мне особо не о чом не говорит.

Цитата (Alehandr @ 21.11.2009 - 18:18)
2: Практика будет дальше...


На данный момент мне нужна не практика а простой пример чтоб увидеть как это работает.


Спустя 4 минуты, 48 секунд (21.11.2009 - 15:24) HardWoman написал(а):
Joker

Ты видимо забыл опять, что ты разговариваешь с преподавателем. ты что то требуешь или просишь? Если просишь - то делай это вежливо.
А если требуешь - брысь отсюда.
Я уже предупреждала - смени тон

Так и чешуться руки дать тебе денек погулять. Ой дождешься - не удержусь

Мне например все понятно - не фиг по строчкам прыгать. Читай внимательно.

Спустя 4 минуты, 56 секунд (21.11.2009 - 15:29) Joker написал(а):
Цитата (HardWoman @ 21.11.2009 - 18:24)
Ты видимо забыл опять, что ты разговариваешь с преподавателем. ты что то требуешь или просишь? Если просишь - то делай это вежливо.
А если требуешь - брысь отсюда.
Я уже предупреждала - смени тон

Так и чешуться руки дать тебе денек погулять. Ой дождешься - не удержусь


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

Спустя 28 секунд (21.11.2009 - 15:30) Alehandr написал(а):
Joker
Учить только по своим соображениям не гуд, нужно чтобы люди научились сами искать нужную информацию и делать соответственные выводы. А потом, я покажу как решил тот или иной вопрос.

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



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

Примеры использования MVC:

Спустя 6 минут, 23 секунды (21.11.2009 - 15:36) Joker написал(а):
Ну вот этого я и хотел, то есть на сколько я понел.

Ну вот на примере гостевой разберу.

В моделе прописаны функции выборки, удаления, добавления соответственно select(), delet(), add() в эти функции передуються какие то параметры и эти функции уже используються в контролере, а сами функции прописываються в моделе, и чтоб допустим нам с файлов перейти на базу нам надо лишь изменить содержании этих функций в моделе. правильно я всё понел?

Спустя 3 минуты, 57 секунд (21.11.2009 - 15:40) Alehandr написал(а):
Joker
В точку...

Спустя 1 минута, 11 секунд (21.11.2009 - 15:41) Joker написал(а):
Alehandr

Ну вот спасибо видишь привёл простой пример с гостевой и сразу стало всё ясно, пошел, искать материал по сиглы)

Спустя 1 минута (21.11.2009 - 15:42) Guest написал(а):
class Conroller {

private $model = null;

public function __constructor
{
$this->model = Model::getObjModelConnect();
}

// Дальнейшие методы и логика
public function out()
{
$outHtml = new View;
$users = $this->model->getUsers();
$outHtml->renderhtml($users);
}
}

class Model {

private function __constructor()
{
if(!$tthis->link) {
$this->link = _dbconnect(....);
// Остальная логика
}
}

public static function getObjModelConnect()
{
$objDb = new Model();
return $objDb;
}

// Далее можно описывать методы с запросами
public function getUsers()
{
$sql = "SELECT * FROM `users`";
// Логика
...
return $dateUsers;
}
}

class View {

public function renderHtml($date)
{
var_dump($date);
}
}

Спустя 4 минуты, 21 секунда (21.11.2009 - 15:47) Alehandr написал(а):
Guest
Не нужно лишнего кода! Все это будет дальше, на практике...

Спустя 1 час, 20 минут, 40 секунд (21.11.2009 - 17:07) Хозяин Огня написал(а):
Можно я тоже спрошу на примере гостевухи?)
Значит в модели - функции добавления, удаления, обновления, расположенные в отдельных файлах с расширением рнр.
Контроллер - не врубился, но кажется что-то связанное с передачей переменных от пользователя.
Представление - чистый нтмл, правя который мы можем менять например вид таблицы сообщений в гостевой книге?

Не слишком упростил? А вот, скажем подключение к БД, создание таблиц и т.д где должны находиться?

И наверное каждый из трёх компонентов должен и физически находиться в "отдельном месте" - в отдельных папках и файлах?

Спустя 5 часов, 37 минут, 46 секунд (21.11.2009 - 22:45) Joker написал(а):
Alehandr
Вот поэтому я и просил пример. Чтобы не возникало как у меня так и других людей лишних вопросов. Практика это одно, а пример для показания что есть текущая теория темы это совсем другое.

Вот уже нас двое я и Хозяин Огня я на 99% уверен что еще будут такие как мы, хотя возможно не будет т.к. на наших вопросах многие это уже поймут.

А вот что я понел и как понел возможно комуто поможет.

Модель
Тут прописаны многие функции которые использует контроллер для построения своей логики и записи всего в переменную.
Контроллер
это логика страницы она определяет что выводить и куда отталкиваясь на массив $_GET или еще на какие нибудь параметры зависит от ситуации.
После выполнения своих действий он всё записывает в переменную.
Представление
Берет переменные из контроллера и воплощает их в html код.



Вот простой пример взял пример гостя слегка переделал и раскоментировал

Вот пример с ипользованием базы.

Свернутый текст
class Conroller
{
private $model = null;
private $view = null;

// При создании класса контроллера мы создаём так же еще модель и представление.
public function __constructor
{
$this->model = new Model();
$this->view = new View();
}

// Дальнейшие методы и логика
public function out()
{
// Теперь мы с помощью модели записываем всех юзеров в переменную.
$users = $this->model->getUsers();
// Далее с помощью представления всех юзеров мы выводим на экран.
$this->view->renderhtml($users);
}
}


class Model
{

// Функция которая возращает массив со всеми пользователями.
public function getUsers()
{
$sql = "SELECT * FROM `users`";
// Логика
// ...
// фунции преобразуещее запрос и т.д. и т.п. в игтоге у нас должен появиться массив со всеми пользователями.

return $dateUsers;
}
}


class View
{
// Функции которая преобразует переданую информацию из контролра в html
public function renderHtml($date)
{
var_dump($date);
}
}




Использовать этот пример просто

Свернутый текст

$class = new Conroller();
$class -> out();


А вдруг нам вместо базы нужно будет использовать файлы и тогда мы просто создадим новую модель

Свернутый текст


class Model
{

// Функция которая возращает массив со всеми пользователями.
public function getUsers()
{
$file = file_get_contents('users.txt');
// Логика
// ...
// фунции преобразующие файл в массив со всеми пользователями.

return $dateUsers;
}
}




И использование примеры уже на файлах будет таким же как и на базе.

вот

Свернутый текст

$class = new Conroller();
$class -> out();




И кстати когда переделал пример гостя понел для чего это вообще нужно классный курс начал вести! жду продолжения!!

Спустя 2 часа, 10 минут (22.11.2009 - 00:55) glock18 написал(а):
Вообще во всем приходит понимание только тогда, когда делать что-то начнешь.

Спустя 1 час, 29 минут, 33 секунды (22.11.2009 - 02:25) G3/SG1 написал(а):
Если другими словами сказать, то модель - это поток вывода, поведение - поток ввода, а представление - графическая оболочка. Верно ли?

Спустя 4 часа, 48 минут, 11 секунд (22.11.2009 - 07:13) Alehandr написал(а):
glock18
Да, пока сам не начнешь, ничего путем понятно не будет...

G3/SG1
В каком-то смысле да.

Спустя 2 часа, 36 минут, 15 секунд (22.11.2009 - 09:49) Argnist написал(а):
Спасибо, с нетерпением жду следующего урока!

Спустя 7 дней, 10 часов, 6 минут, 46 секунд (29.11.2009 - 19:56) Хозяин Огня написал(а):
Нашёл такое определение.

Цитата
Как известно, над проектом обычно работают программист и
дизайнер. На дизайнере лежит ответственность за HTML (в данном
случае подразумевается технический дизайнер), а на программи-
сте - за все остальное. В случае совмещения PHP-скриптов и кода
HTML дизайнер должен, по крайней мере, уметь читать скрипты,
чтобы не навредить им, а программист должен уметь легко отсеи-
вать из получившихся файлов HTML.
Свет в конце туннеля
Решение вышеозначенной задачи нашлось в области Объект-
но Ориентированного Проектирования, а именно в схеме
Model/View/Controller (MVC). MVC предлагает разделять логику
модели (Model), логику представления (View) и бизнес-логику
(Controller). В нашем случае, то есть в веб-проектах, в большинстве
случаев мы уже имеем отделенную логику модели - базу данных.
Как известно, СУБД имеют собственные методы поддержки це-
лостности баз данных, что позволяет вынести из скриптов логику
модели. Теперь остается решить, как отделить бизнес логику от ло-
гики представления. Выражение «логика представления» очень хо-
рошо сочетается с выражением «markup language» (язык разметки).
Остался третий компонент - controller, то есть то, что всем управ-
ляет. На эту роль очень хорошо подходит PHP.
Реализация MVC в WEB
Итак, мы имеем три компонента, давайте посмотрим, как все
это должно работать. При поступлении запроса начинает работать
PHP-скрипт (Controller). Исходя из полученных параметров, он
запрашивает данные у базы данных (Model), затем выбирает шаблон
(View), если он не известен заранее, который и отображает эти дан-
ные. Одна из разновидностей этой схемы - это когда шаблон сам
запрашивает у скрипта нужные ему данные

Спустя 11 часов, 38 минут, 45 секунд (30.11.2009 - 07:35) Argnist написал(а):
по идее к модели еще можно отнести логику работы с ней, то есть всякие mysql_query(), mysql_fetch_assoc() и т.п.

Спустя 20 часов, 2 минуты, 40 секунд (1.12.2009 - 03:37) VolCh написал(а):
По идее к модели можно отнести всё, что относится к данным, вся бизнес-логика, контроллер должен, имхо, реализовывать только логику управления приложением. НЕ ПУТАЙТЕ бизнес-логику и логику управления. БД, а вернее хранилище данных (а это может быть и файлы, и данные в памяти, и даже всякие куки) - часть модели, причем не обязательная.

В идеале в контроллере две части - определить какой метод модели вызвать (ну и вызвать его smile.gif ) и определить как отобразить (какое представление вызвать) результаты, полученные от модели. В простейшем случае две строки, например:

$data = Model::getData();
View::show($data);

а можно вообще в одну

View::show(Model::getData();


Простой пример: если нам надо получить сумму (или сколь угодно сложную формулу) чисел, хранящихся в БД, то модель должна вернуть сумму (и, если надо отобразить их, собственно числа), не надо считать сумму ни в контроллере, ни, тем более, в представлении. А если нам надо получить сумму двух чисел, введенных пользователем, то надо создать метод в модели, который будет считать эту сумму - пускай будет выглядеть излишне
$data = Model::sum(a, b);
, по сравнению с
$data = a + b;
, но это будет идеологически верно.

Спустя 5 месяцев, 18 дней, 19 часов, 36 минут, 24 секунды (19.05.2010 - 22:14) gomer505 написал(а):
Цитата (Joker @ 21.11.2009 - 12:18)
А еще, когда ведут курсы узучать что самим редко очень при очень редко дают что то самим ну ведь на то они и курсы чтоб научили и показали как делается. А то вон попов напишет коряво про эти сиглы миглы а я его прочитаю и буду с табой спорить что ты не так их используешь а прав буду я т.к. ты сам отослал меня учить в левом месте. и даже не дал сылочку на провереный достоверный материал.

Попробуй разобраться вот в этом. Я проходил раз пять от начала до конца, пока не озарило понимание: Паттерн MVC

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

Спустя 35 минут, 41 секунда (19.05.2010 - 22:49) twin написал(а):
У Жени разве где то еcть MVC?

Спустя 3 минуты, 13 секунд (19.05.2010 - 22:53) twin написал(а):
Цитата
Решение вышеозначенной задачи нашлось в области Объект-
но Ориентированного Проектирования, а именно в схеме

Полная дилетантская чушь.

Спустя 3 минуты, 36 секунд (19.05.2010 - 22:56) gomer505 написал(а):
Цитата (twin @ 19.05.2010 - 19:49)
У Жени разве где то еcть MVC?

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

Спустя 10 минут, 1 секунда (19.05.2010 - 23:06) twin написал(а):
Лично я это делаю намеренно. Женя не программист. Если бы речь шла о коммерсантах, я написал бы его фамилию с трех заглавных. А так все верно. Идеологически верно.
Если он где то на форуме о предпринимательстве напишет мою фамилию с маленькой буквы, я не обижусь. Ибо я балбес, а не коммерсант. Я программист ( по крайней мере стараюсь им выглядеть).

Так что все в порядке - каждому своё.

Спустя 5 месяцев, 9 дней, 13 часов, 25 минут, 24 секунды (29.10.2010 - 12:32) skript написал(а):
Я лично все понял!Спасибо за лекцию!

Спустя 2 месяца, 2 дня, 13 часов, 37 минут, 42 секунды (2.01.2011 - 03:09) sshipkov написал(а):
Цитата (VolCh @ 1.12.2009 - 00:37)
По идее к модели можно отнести всё, что относится к данным, вся бизнес-логика, контроллер должен, имхо, реализовывать только логику управления приложением. НЕ ПУТАЙТЕ бизнес-логику и логику управления. БД, а вернее хранилище данных (а это может быть и файлы, и данные в памяти, и даже всякие куки) - часть модели, причем не обязательная.

В идеале в контроллере две части - определить какой метод модели вызвать (ну и вызвать его :) ) и определить как отобразить (какое представление вызвать) результаты, полученные от модели. В простейшем случае две строки, например:

$data = Model::getData();
View::show($data);

а можно вообще в одну

View::show(Model::getData();

Тоже придерживаюсь этого мнения

Вот статья на эту тему Толстые тупые уродливые контроллеры
И на английском The M in MVC: Why Models are Misunderstood and Unappreciated

Спустя 1 месяц, 13 дней, 16 часов, 57 минут, 8 секунд (15.02.2011 - 20:06) Гость_edward написал(а):
А что насчет:

" Модель в терминах MVC — это не только совокупность кода доступа к данным и СУБД, но и, как минимум, логика домена и, возможно, некоторые другие части системы. В свою очередь контроллеры должны избавляться от логики приложения (Бизнес-логики), которую необходимо перенести в отдельный слой, например в слой служб (Service Layer). Таким образом Контроллер становится «тонким» и выполняет исключительно функцию связующего звена (glue layer) между отдельными компонентами системы."

-из той-же Википедии

Спустя 4 месяца, 1 день, 13 часов, 23 минуты, 49 секунд (17.06.2011 - 08:30) sc2r2bey написал(а):
выскажу свое мнение:
написано немного нелогично, была модель-контроллер-представление, потом из ниоткуда появился роутер, ни здрастьте, ни до свидания, что это и откуда он взялся непонятно, ну про орфографические ошибки я молчу, есть есть ли на эту тему более толковое изложение?
зы а что такое бизнесс-логика?

Спустя 18 минут, 55 секунд (17.06.2011 - 08:49) nugle написал(а):
sc2r2bey

Цитата
была модель-контроллер-представление

всегда было модель-вид-контроллер, в курсе это
router.php - view.php - read_controller.php

Спустя 10 минут, 41 секунда (17.06.2011 - 09:00) sc2r2bey написал(а):
это как бы ответ на мой вопрос?

Спустя 25 минут, 3 секунды (17.06.2011 - 09:25) nugle написал(а):
Цитата
потом из ниоткуда появился роутер, ни здрастьте, ни до свидания, что это и откуда он взялся непонятно


Цитата
это как бы ответ на мой вопрос?

ответ на один из твоего вопроса

Спустя 43 минуты, 4 секунды (17.06.2011 - 10:08) sc2r2bey написал(а):
т.е. если я правильно понял, если создать файл под названием router.php это будет роутер?

Спустя 41 минута, 8 секунд (17.06.2011 - 10:49) nugle написал(а):
sc2r2bey
Если тебе нужно создать модуль, то
router.php - модель
view.php - вид
read_controller - контроллер чтения

Спустя 1 час, 27 секунд (17.06.2011 - 11:50) sc2r2bey написал(а):
вопрос был вообще-то не про названия файлов blink.gif

Спустя 3 месяца, 4 дня, 20 часов, 7 минут, 25 секунд (22.09.2011 - 07:57) Dagot написал(а):
у ирбуса понятней и интеренсей напиано

Спустя 3 минуты, 30 секунд (22.09.2011 - 08:01) Dagot написал(а):
Цитата
sc2r2bey
Если тебе нужно создать модуль, то
router.php - модель
view.php - вид
read_controller - контроллер чтения

А почему вид в .php, а не в соответсвующем формате стилей или шаблонов?

Спустя 12 дней, 13 часов, 57 минут, 11 секунд (4.10.2011 - 21:58) lyudik написал(а):
Вид ведь располагается в контроллере и должен выводиться, поэтому в .php

Спустя 24 минуты, 32 секунды (4.10.2011 - 22:22) caballero написал(а):
Цитата
написано немного нелогично, была модель-контроллер-представление, потом из ниоткуда появился роутер, ни здрастьте, ни до свидания, что это и откуда он взялся непонятно,


Потому что в теории сайт должен быть сделан в говно MVC стиле согласно паттерну. А на практике а не в вумных книгах сделать приложение с одного контроллера одного вида и одной модели малореально.

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


Цитата
а что такое бизнесс-логика

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

Цитата
Вид ведь располагается в контроллере


Если вид в контроллере то почему он составляющая часть MVC наряду с контроллером?


Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2025 Invision Power Services, Inc.