За последние 24 часа нас посетили 23015 программистов и 1241 робот. Сейчас ищут 715 программистов ...

В чём приемущество MVC

Тема в разделе "Прочие вопросы по PHP", создана пользователем Mr.M.I.T., 29 янв 2009.

  1. sylex

    sylex Активный пользователь

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск
    тогда прочитай сначала внимательно про мвц :)
     
  2. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Потому что на каждое действие свой контроллер. А сколько он будет юзать моделей и вьюшек - его личное дело.

    Просто у тебя эти самые модули - это есть контроллеры. А, то, что называется главным контроллером - это роутер.

    ZendGuard купите :) Ну или если все так плохо, то пора переползать на java.

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

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    Скорее это диспетчер :) А для работы с url'ами он использует роутер.

    по крайней мере, в моём понимании это так :)
     
  4. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Диспечер, контроллер, какая ф попу разница. Это просто большой switch

    PHP:
    1. <?php
    2. if (!array_key_exists($session['auth'])) {
    3.     switch (PAGE) {
    4.        
    5.         case '':
    6.             module('News', CENTER_SUB); // Список новостей на главной
    7.             break;
    8.        
    9.         case 'news':
    10.             module('News', CENTER); // Весь список новостей
    11.             break;
    12.            
    13.         // Всё, что можно видеть без авторизации
    14.            
    15.         default:
    16.             module('Authorize', CENTER); // Сперва авторизация
    17.             break;
    18.     }
    19. } else {
    20.     switch (PAGE) {
    21.        
    22.         case '':
    23.             module('User', CENTER_SUB); // Выводит общий краткий блок профиля на странице
    24.             module('News', CENTER_SUB); // Список новостей на главной
    25.             break;
    26.            
    27.         case 'news':
    28.             module('User', CENTER_SUB);
    29.             module('News', CENTER); // Весь список новостей
    30.             break;
    31.            
    32.         case 'user':
    33.             module('User', CENTER_SUB);
    34.             module('User', CENTER); // Профиль пользователя
    35.             break;
    36.        
    37.         // Всё, что можно видеть под авторизацией
    38.        
    39.         default:
    40.             forward(); // Нефиг вводить чушь, топай на главную
    41.     }
    42. }
    43.  
     
  5. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Тоже хорошее название. Короче, это такая штука, которая решает, кому отдать управление :)

    А реализация не имеет значения :)
     
  6. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    У меня как-то так сделано
    PHP:
    1. <?php
    2. // ...
    3. $router = new RewriteRouter();
    4. $router->addRoute(new Route('/news/(\d+)', 'news', 'view', array('id')));
    5. $router->addRoute(new Route('/news/editors/', 'news', 'list', array('type' => 1)));
    6. $router->addRoute(new Route('/news/users/', 'news', 'list', array('type' => 2)));
    7. // ...
    8. $dispatcher->setRouter($router);
    9. $dispatcher->dispatch($request->getUri());
    10.  
    Стандартный формат для каждого роутера свой. Например, /news/view/id,123/. Все нестандартные форматы uri добавляются через addRoute. По мне так удобно :)
     
  7. Psih

    Psih Активный пользователь
    Команда форума Модератор

    С нами с:
    28 дек 2006
    Сообщения:
    2.678
    Симпатии:
    6
    Адрес:
    Рига, Латвия
    Проще помоему иметь единый формат и не париться :)
     
  8. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    Sergey89
    интересно у тебя сделано, у меня попроще
    PHP:
    1. <?
    2. // [url=http://site.com/showforum/byid_3]http://site.com/showforum/byid_3[/url]
    3. Rewriter::Run(array("slt"=>"_","st"=>".html","stl"=>"/"));
    4. Rewriter::AddType(array("act","method"));
    5. if(Rewriter::$get['act']){
    6.    /* .... */
    7.    if(Rewriter::$get['method'][0]) /*...*/
    8. }
    9. ?>
     
  9. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Sergey89
    У меня соответствие запрошенного url и пути до контроллера, т.е. для /news будет вызван контроллер Controller_News, в котором уже в конструкторе методами setRoute(регулярка, имя метода) делается то же, что и у тебя.
    Вызываемому методу в качестве аргументов передаются результаты третьего аргумента preg_match, т.е. то, что в регулярке в скобках.
    Иерархия контроллеров тоже присутствует, т.е. /forum/users/topusers вызовет контроллер topusers, а если его нет, то users, если и его нет, то forum, ну а если и он отсутствует, то вызовет контроллер, назначенный главным (он же вызывается при корневом пути). В конструкторе главного опять же через setRoute можно все отловить.
    Как-то так.
     
  10. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Ну и автолоад сделан так, что по имени класа Controller_Forum_Users загрузит файл из controller/forum/users.php
     
  11. Sergey89

    Sergey89 Активный пользователь

    С нами с:
    4 янв 2007
    Сообщения:
    4.796
    Симпатии:
    0
    У меня на каждое действие определён Action класс

    PHP:
    1. <?php
    2. class NewsPostAction extends Action {
    3.     public function doGet() {
    4.         // показали форму
    5.     }
    6.  
    7.     public function doPost() {
    8.         // сохранили результат
    9.     }
    10. }
    Чтобы не вводить ещё один промежуточный уровень между экшеном и диспетчером я заранее определяю все возможные варианты роутинга.
     
  12. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    а может ли быть "связка" контролеров? например отдельные контролеры страницы и отдельный для товара. и контролер страницы передает управление контролеру товара и потом следующему (той же меню) по очереди, то есть контроллерам всех размещенных внутри страницы моделей, а потом каждый из этих контроллеров точно так же передает управление всем вложенным в него и т.д. пока не будет обработана самая мелкая модель, которую уже не на что разложить. Или на всю страницу обязательно должен быть один контроллер, который отвечает за все- все действия на странице?
     
  13. Mr.M.I.T.

    Mr.M.I.T. Старожил

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    а как контроллер товара будет управлять страницами?
     
  14. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    зачем? и зачем модели раскладывать? модель - это все необходимое для работы с тем или иным объектом. не надо ее раскладывать.
     
  15. Я понял, о чем он. О том, что в симфони зовется компонентами.
     
  16. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    Буду говорить примерами. Есть модель Сотрудкик.
    Она имеет:
    - путь в дереве объектов
    - фамилию
    - имя
    - очество
    - должность
    - 3 телефона
    - кабинет
    - майл
    - йску
    - день рождения

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

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

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

    [​IMG]
    [​IMG]
    [​IMG]

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

    Это что такое МВЦ, не МВЦ? Если не МВЦ, то как это правильно называется? Я весь комплекс в таком ключе слабал
     
  17. Модель не должна знать о своем положении в какой либо иерархии.
    Имхо, у тебя должа быть модель дерева обьектов, которая должна уметь
    это ИМХО должен делать контроллер.
    А это вообще должно делать представление. В этом конкретном случае, я считаю, допустимо добавить это специфическое действие в модель, но это неверно с точки зрения ООП.
     
  18. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    Даже не хочу это обсуждать. Интересно мнение про иерархию контроллеров. Это МВЦ все- таки или не МВЦ и тогда как это называется?
     
  19. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    Какой кусок кода? Вызов одного метода модели? Или двух? :)

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

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

    Для этого нужно иметь достаточно функциональный шаблонизатор :)

    Если интересен только ответ на вопрос «MVC или нет?», то нет.
     
  20. AlexGousev
    а между прочим, представление, это не только шаблонизатор. Это вполне может быть какой-то промежуточный слой логики, даже в виде просто кода, выполняющийся перед шаблоницацией. ;)
     
  21. AlexGousev

    AlexGousev Активный пользователь

    С нами с:
    25 мар 2006
    Сообщения:
    1.505
    Симпатии:
    0
    Адрес:
    Москва
    флоппик
    Ну так шаблонизатор - это не только str_replace ;-)
     
  22. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    вы это серьезно? ссылку на первоисточник, пожалуйста, или это собственное заявление? сдается мне вы погорячились
     
  23. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    alexey_baranov уважаемый. Это не религия, где "делать надо так, как в книге написано". Это надо думать своей головой и понимать, почему и с какой целью так написано.
    Модели не должны зависеть от других моделей. Объяснять почему?
     
  24. alexey_baranov

    alexey_baranov Активный пользователь

    С нами с:
    3 фев 2009
    Сообщения:
    647
    Симпатии:
    0
    Адрес:
    Сургут
    для начала уточним один момент. я говорю про "не должны взаимодействовать", а вы говорите "не должны зависеть". это очень разные вещи зависеть и взаимодействовать. объяснять почему?

    Если вы тоже считаете, что "модели не должны взаимодействовать друг с другом", потрудитесь пожалуйста. интересно послушать
     
  25. sylex

    sylex Активный пользователь

    С нами с:
    9 ноя 2008
    Сообщения:
    625
    Симпатии:
    0
    Адрес:
    Омск