Share →

8 Responses to Как работает MVC в .Net — видео

  1. Хорошо бы и предыдущий пост про php сделать таким же четким, как этот.

    Пришел запрос

    -> фронт-контроллер его встретил, разобрал на параметры, определил конечный контроллер, т.е. произвел маршрутеризацию (раутинг),

    ->если надо прогнал разобранный запрос через цепочку входных фильтров. Например был нужен логин. Если не залогинились, фильтр кинул исключение-редирект на форму логина. Если все ок, к параметрам запроса добавились логин, права и прочие данные эккаунта.

    -> вызвал конечный контроллер, передали ему параметры запроса

    -> получил результат: массив переменных, класс вью, или же контроллер бросил исключение на редирект (тогда перехват во фронт-контроллере и реальный редирект)

    ->создал необходимый вью, передал туда параметры,

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

    -> прогнал результирующий набор данных через цепочку выходных фильтров (макет страницы)

    -> срендеренный результат отдал браузеру.

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

    Можно и отдельным постингом про ЭктивРекорд в качестве модели рассказать. Тоже хватит 20 строчек. Клас запись, дла клас Пир, то есть table gateway. Рилейшенс и о том, что не надо эти рилейшенс особенно программировать, чтобы не увязнуть в борьбе. В довесок какой-нибудь класс Select из Zend FW, чтобы получить от модели запрос и еще его помодифицировать объектным образом. А то что такое модель обычно тоже непонятка совершенная.

    А еще лучше слайды, потому, что видео смотреть утомительно.

  2. admin:

    такое описание хорошо для тех. кто понимает, что такое MVC и как он работает.

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

    Главное — я встречаю только 1 из 50 человек, который понимает, что такое MVC на самом деле

  3. Просто это понятие надо давать предельно четко. Иначе все расплывается. Вот помню как я осваивал этот паттерн лет 5-6 назад. Так-так… сложно, ну его нафик…. Не ну ладно, не нафик… вью отделим в супершаблонизатор…. так-так мммм…. вот есть класс который и форму рисует и данные для формы из базы забирает, наверное это модель? Ну да, конечно модель — ведь с базой работает…. Так-так…. а вот хотим репорт построить пусть нам форма параметры таблицы выдаст, ведь это ж модель… нехай работает…. УУУУУ как было паршиво все это шишками набивать. Сейчас даже вспоминать стыдно. А вот посмотрел на Сифони и все встало на место, как влитое. Фронт-контроллер-раутинг-запись-тейбл-гейтвей…. и от сердца отлегло.

    ИМХО если человек не дожил до не обходимости использовать MVC, ему и объяснять нечего, — не будет использовать. А вот как должил — крайне важно изложить понятия, словарь и схему работы. Иначе сон разума будет рождать чудовищ.

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

    ИМХО конечно, совершеннейшее ИМХО.

  4. admin:

    Я бы не рекомендовал использовать Active Records, т.к. мне пришлось повидать несколько серьезных сайтов, которые от него здорово пострадали.
    Слава богу, что я сам от него отказался еще 5 лет назад

  5. Было бы интересно узнать, как такой легковесный паттерн мог навредить?

    А чем заменили для себя? Ведь как-то надо работу с данными упорядочивать?

  6. admin:

    Как чем? Быстрее прямого запроса в БД ничего нет. 🙂
    Просто берем небольшой враппер типа PEAR::MDB2 и используем.

    Сейчас я работаю с Битриксом, поэтому никаких особых вариантов, кроме их внутреннего API вообще нет

  7. Евгений, ActiveRecord может быть конечно очень разным. Но в в примитивном виде он крайне легковесен — получить объект, записать объект, взять список объектов. Немного попродвинутей — вытащить связанные значения один-ко-многим. Просто это приходится делать часто. Это не замена SQL совершенно. Просто подход к автоматизации части работы.

    Так, что Битрикс тут не пример совсем.

    Так или иначе модель Вы пишите. Тут даже не в

    используемой библиотеке дело. А в идиомах — понятия записи, схемы данных, операций выборки. Когда классы и методы имеют понятные названия вроде record, save, new, и т.д. с ними становится понятно, как работать.

    Если не ставить себе цель заменить sql, то может быть очень легковесно и прозрачно.

    Я взял Zend-DB и форкнул ОРМ-ную часть под себя (мне не нравилось там, что классы черпают информацию о полях прямо из БД. Ну вот захотелось мне, что бы были схемы, как в пропел и еще немного по мелочи). Очень доволен.

    Вот такие конструкции облегчают жизнь очень:
    $newEngine=new engine();
    $newEngine->name=’Renault’;
    $newEngine->suffix=’Racing’;
    $newEngine->save();

    $toyota=enginePeer::findByPK(2);
    //это прямо из тестов цитата, поэтому можно посмотреть
    //результат
    $this->assertEqual($toyota->toArray(),array(‘id’ => 2, ‘name’ => ‘Toyota’, ‘suffix’ => ‘Racing’),’Find by ID, ok’);

    $ferrari=enginePeer::findOne($this->dbConn->quoteInto(‘name=?’,’Ferrari’));
    $this->assertEqual($ferrari->toArray(),array(‘id’ => 3, ‘name’ => ‘Ferrari’, ‘suffix’ => ‘FIAT’), ‘Find by expression, ok’);

    Или даже вот так:
    $mercedezSQL=enginePeer::findByFieldSQL(‘name’,’Mercedez’);
    $this->assertEqual($mercedezSQL,’SELECT «engine».* FROM «engines» AS «engine» WHERE «name»=\’Mercedez\»,’Find SQL Built ok’);

    или манипулировать вот так:
    $teamRelatedSQL=teamPeer::select();
    $teamRelatedSQL->joinLeftRelated(‘Engine’);
    $this->assertEqual($teamRelatedSQL,
    ‘SELECT «team».*, «Engine».»name» || » » || «Engine».»suffix» AS «Engine_text» FROM «teams» AS «team»
    LEFT JOIN «engines» AS «Engine» ON «team».»engine_id» = «Engine».»id»‘,
    ‘Join one to many built ok, concatenation in SQLToString is used correctly’);

    возможность манипуляции запросом это круто, потому, как мы не пытаемся SQL заменить, а добавить гибкость, когда получили сырой запрос и дорабатываем его в другом месте уже:
    $teamAllRelatedSQL=teamPeer::select();
    $teamAllRelatedSQL->joinLeftAllRelated();
    $teamAllRelatedSQL->order(‘team.name’);

    и даже вот так можно 🙂
    $williamsTeam=teamPeer::findOneByField(‘name_eng’,’Williams’);
    $sponsorsSQL=$williamsTeam->findManyToManySQL(‘sponsor’, ‘sponsorToTeam’);
    $this->assertEqual($sponsorsSQL,
    ‘SELECT «i».*, «sponsor».* FROM «sponsors_to_teams» AS «i»
    INNER JOIN «sponsors» AS «sponsor» ON «i».»sponsor_id» = «sponsor».»id» WHERE «i».»team_id» = \’1\»,
    ‘Select many-to-many related sponsors SQL built Ok’);

  8. admin:

    не-не-не. нафиг-нафиг. Я категорически против Active Records.

    Не надо меня убеждать в её хорошести — всё равно не поможет 🙂

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