За последние 24 часа нас посетили 50993 программиста и 1804 робота. Сейчас ищут 745 программистов ...

MVC

Тема в разделе "Прочие вопросы по PHP", создана пользователем ExDragon, 9 май 2011.

  1. ExDragon

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

    С нами с:
    18 дек 2010
    Сообщения:
    76
    Симпатии:
    0
    Как можно реализовать данного зверя? мой вариант.. но он точно не правильный! помогите советом что нужно переделать..
    Код (Text):
    1. class Controller
    2. {
    3.     protected $view = array();
    4.  
    5.     // Главный запрос определюющий конечный фаил
    6.     function Route()
    7.     {
    8.         $route = $_GET['route'];
    9.  
    10.         // Получаем раздельные части
    11.         $route = trim($route, '/\\');
    12.         $this->view = explode('/', $route);
    13.     }
    14. }
    15. class Modul extends View
    16. {
    17.     function Template($skin)
    18.     {
    19.         $this->ControlFile();
    20.  
    21.         return 'template' . DIRSEP . $skin . DIRSEP . 'index.php';
    22.     }
    23.  
    24.     function File()
    25.     {
    26.         return $this->modul;
    27.     }
    28. }
    29. class View extends Controller
    30. {
    31.     protected $modul;
    32.  
    33.     function ControlFile()
    34.     {
    35.         $this->Route();
    36.  
    37.         $cmd_path = 'view';
    38.  
    39.         // Поиск пути
    40.         foreach ($this->view as $part) {
    41.             $fullpath = $cmd_path . DIRSEP . $part;
    42.  
    43.             // Есть ли папка с таким путём?
    44.             if (is_dir($fullpath)) {
    45.                 $cmd_path .= DIRSEP . $part;
    46.                 array_shift($this->view);
    47.                 continue;
    48.             }
    49.  
    50.             // Находим файл 
    51.             if (is_file($cmd_path . DIRSEP . $part)){
    52.                 $view = $cmd_path . DIRSEP . $part;
    53.                 array_shift($this->view);
    54.                 break;
    55.             } else {
    56.                 $view = 'view/404.php';
    57.             }
    58.         }
    59.  
    60.         if (empty($view)) $view = $cmd_path . DIRSEP . 'main.php';
    61.  
    62.         $this->modul = $view;
    63.     }
    64. }
     
  2. Mr.M.I.T.

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

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    пока не поймешь зачем оно и как, лучше не пытаться.
    пишите как вам нравится, и однажды у вас получится MVC ;)
     
  3. Alex_pac

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

    С нами с:
    11 апр 2011
    Сообщения:
    285
    Симпатии:
    1
    Адрес:
    Россия, Тольятти
    меня всегда умиляла модель когда классы наследуют друг друга. напрашивается вопрос, а зачем вообще тогда ООП?

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

    MVC только с помощью патерна синглтон имеет гибкость. тоесть когда классы глобальны и наследовать их ненужно.

    Получаем логичноть архитектуры в этом случае во всех смыслах.

     
  4. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Главная ошибка новичков - они считают, что бизнес-логика должна быть везде. В то время как идея MVC как раз выделить бизнес-логику в контроллер, максимально отделив друг от друга представление, бизнес-логику и данные.
    Нет, View - это могут быть тупо нативные шаблоны, модель - СУБД, а контроллер - вся логика, которая будет подключать шаблоны и получать/записывать данные в MySQL. Вот вам и MVC.
     
  5. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Фееричный бред.
    Есть только одна причина использовать синглтон - получить фабрику. За остальные нужно отрывать руки.
    MVC и синглтон имеют друг другу отношение как корова и дождик.
     
  6. Mr.M.I.T.

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

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    идея MVC в первую очередь в том, чтобы легче стало жить. раз стало, значит все путем :)
     
  7. Mr.M.I.T.

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

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    а основная ошибка новичков в том, что они используют мвц для того, чтобы было мвц.
     
  8. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    ты никак записался в кружок юных петросянов
     
  9. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Alex_pac
    Вроде бы классовый ООП прежде всего призван экономить пространство имен
    откуда берутся такие безумные идеи? =) ООП призван упростить разработку. Только это и ничего кроме.
     
  10. igordata

    igordata Суперстар
    Команда форума Модератор

    С нами с:
    18 мар 2010
    Сообщения:
    32.408
    Симпатии:
    1.768
    Alex_pac
    MVC только с помощью патерна синглтон имеет гибкость.
    что ни фраза - то перл! Еще парочка топиков и жемчужный фонд россии переедет в квартиру алекса.
     
  11. [vs]

    [vs] Суперстар
    Команда форума Модератор

    С нами с:
    27 сен 2007
    Сообщения:
    10.559
    Симпатии:
    632
    Ну вообще ООП действительно решает многие проблемы, которые возникают когда все переменные в одном неймспейсе.
    Но решить проблему нехватки пространства имен призваны множественные пространства имен (которые появились в PHP 5.3).
    Наследование - важнейший инструмент а ООП после инкапсуляции.
     
  12. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
  13. MiksIr

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

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Ага, ттук... ну в принципе для небольших проектов как вариант. Т.е. если один товарисч обозвал это тупым и уродливым и даже если при этом он прав - еще не повод бездумно все переделывать. Но в общем ввод service layer бывает удобен.
     
  14. engager

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

    С нами с:
    21 янв 2009
    Сообщения:
    1.106
    Симпатии:
    1
    ZF хорошо оптимизируется под хайлоад. примеров полно.
     
  15. Mr.M.I.T.

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

    С нами с:
    28 янв 2008
    Сообщения:
    4.586
    Симпатии:
    1
    Адрес:
    у тебя канфетка?
    "Что такое хорошо и что такое плохо?" :D
     
  16. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    MiksIr

    Может и для больших вариант, если однотипные.

    Согласен, сервисный слой рулит.
     
  17. bingo

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

    С нами с:
    28 апр 2011
    Сообщения:
    3
    Симпатии:
    0
    MiksIr, tommyangelo , друзья, покажите пример правильного с вашей точки зрения сервисного слоя, а то все абстрактно как-то =)
     
  18. tommyangelo

    tommyangelo Старожил

    С нами с:
    6 дек 2009
    Сообщения:
    2.549
    Симпатии:
    0
    Адрес:
    Мариуполь
    я могу упрощенно рассказать.

    Например есть модель, которая каким-то своим способом (например через конструктор запросов) работает с таблицей Users

    Без сервисного слоя мне чтобы выбрать забаненых юзеров прямо в контроллере пришлось бы писать что-то типа

    $modelUser = new User();

    $modelUser->findAll()->where('status = ' . STATUS_ACTIVE);

    А если эту операцию вынести в сервисный слой, то в контроллере будет что-то типа User::GetByStatus(STATUS_ACTIVE) либо вообще User::GetBannedUsers()

    Профит в том, что контроллеру не нужно знать каким способом модель работает с данными и каким способом эти данные получены. Можно написать Unit-тесты для сервисного слоя, для контроллера это сделать сложнее. Можно изменить хранилище данных - например вместо базы хранить в файлах, или вообще в php-массивах (иногда так и делаю со статичными данными).
     
  19. Shadofff

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

    С нами с:
    24 мар 2011
    Сообщения:
    48
    Симпатии:
    0
    http://code-igniter.ru/ Посмотри... Фраймворк, но уверен, это то что тебе будут нужно..