ФорумПрограммированиеPHP для идиотов → По какому принципу работает роутинг и фронт контроллер

По какому принципу работает роутинг и фронт контроллер

  • aba90

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 24 февраля 2013 г. 4:35

    Ну все запросы идут к одному файлу, это понято. Затем берется $_GET и каким образом активируется нужный класс и метод? {+++63+++} Я пытался подглядеть в больших системах, но там для меня слишком сложный код
  • aba90

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 24 февраля 2013 г. 4:43, спустя 8 минут 22 секунды

    просто тупо создается экземпляр и выполняется метод?
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 24 февраля 2013 г. 5:59, спустя 1 час 16 минут 11 секунд

    обычно не get а request_uri, хотя в итоге он разбивается на тот же массив с переменными

    можно по шагам разобрать
    1. приходит тебе url вида /articles/123_how-do-you-do?a=b

    2. у тебя есть роуты вида
    $routes = array(
    array('rule' => '#/articles/(?P<id>\d+)_[^/]*/?#', 'controller' => 'articles', 'action' => 'single_item'),
    array(…),
    )

    3. ты вычленяешь из своего url часть /articles/123_how-do-you-do и прогоняешь последовательно по роутам
    foreach ($routes as $route){
    if (preg_match($route['rule'], $url, $params)){
    $route['controller']->$route['action']($params);
    }
    }
    // ошибка 404

    собственно всё
    не всё полезно, что в swap полезло
  • aba90

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 24 февраля 2013 г. 6:01, спустя 1 минуту 46 секунд

    не нравится мне это дело. Если я без роутинга организую разделение логики и представления, я сильно говнокодю?
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 24 февраля 2013 г. 6:05, спустя 4 минуты 35 секунд


    просто тупо создается экземпляр и выполняется метод?

    По-разному. Но чаще всего да, тупо создаётся экземпляр и выполняется метод.
    Правильнее конечно будет потом передать в шаблон
    $data = $route['controller']->$route['action']($params);
    $tpl->render("{$route['controller']}/{$route['action']}.tpl", $data);

    потом навешать свистелок с перделками типа динамического перехвата http-заголовков (Accept, Accept-Language и т.д.) {+++48+++}
    Если я без роутинга организую разделение логики и представления, я сильно говнокодю?

    умеренно. чем больше разрастётся тем сложнее поддерживать
    не всё полезно, что в swap полезло
  • aba90

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 24 февраля 2013 г. 6:24, спустя 18 минут 25 секунд

    я не хочу использовать фрейморки, так как реализация моя обычна бывает очень лаконична. Даже сложные задачи решаются в 20-50 строк. А тут сотня чужих классов… Роутинг тоже в php мне представляется костылем
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 24 февраля 2013 г. 6:27, спустя 2 минуты 42 секунды

    Роутинг тоже в php мне представляется костылем

    а сам php костылём не представляется? есть же html
    не всё полезно, что в swap полезло
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 24 февраля 2013 г. 6:43, спустя 16 минут 37 секунд

    Вообще говоря, всё программирование - суть манипуляция абстрациями. Вводятся новые абстракции, близкие к человеческим понятиям, позволяющие абстрагироваться от деталей и сконцентрироваться на главном. Роутинг - один из таких приёмов.
    не всё полезно, что в swap полезло
  • AlexB

    Сообщения: 4288 Репутация: N Группа: в ухо

    Spritz 24 февраля 2013 г. 7:00, спустя 16 минут 48 секунд


    я не хочу использовать фрейморки, так как реализация моя обычна бывает очень лаконична. Даже сложные задачи решаются в 20-50 строк. А тут сотня чужих классов… Роутинг тоже в php мне представляется костылем
    Ты, чувак, неправ и насчет фреймворков и насчет роутинга. Но это понимание придет (я надеюсь) с опытом.
  • aba90

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 24 февраля 2013 г. 7:05, спустя 4 минуты 56 секунд

    а есть ли готовая шкурка для роутинга? Без лишних наворотов. Мне не нужно все что дает фреймфорк.
  • AlexB

    Сообщения: 4288 Репутация: N Группа: в ухо

    Spritz 24 февраля 2013 г. 7:18, спустя 13 минут 32 секунды


    а есть ли готовая шкурка для роутинга?
    А что ты ждешь от нее? Ведь простейший роутинг, который ну например по урлу вида site.ru/a/b создает экземпляр класса a и вызывает метод b (чисто умозрительный пример) - это всего лишь несколько строк кода.
  • aba90

    Сообщения: ? Репутация: N Группа: Кто попало

    Spritz 24 февраля 2013 г. 7:33, спустя 14 минут 24 секунды



    а есть ли готовая шкурка для роутинга?
    А что ты ждешь от нее? Ведь простейший роутинг, который ну например по урлу вида site.ru/a/b создает экземпляр класса a и вызывает метод b (чисто умозрительный пример) - это всего лишь несколько строк кода.


    да и я хренов изобретатель велосипедов



    $uri = $_SERVER['REQUEST_URI'];

    $array_uri = explode('/',$uri);

    print_r($array_uri);

    $controller = $array_uri[1];
    $action = $array_uri[2];

    $obj = new $controller();
    $action = 'action_'.$action;
    $obj-> $action();

  • AlexB

    Сообщения: 4288 Репутация: N Группа: в ухо

    Spritz 24 февраля 2013 г. 8:17, спустя 44 минуты 30 секунд

    Ну что-то типа этого
    + еще всякие проверки, на невалидные урлы.
  • master

    Сообщения: 3236 Репутация: N Группа: Джедаи

    Spritz 24 февраля 2013 г. 8:36, спустя 18 минут 23 секунды

    про роутер были уже тысячи бесед
    например http://pyha.ru/forum/topic/6748.msg152520#msg152520
    кратко: роутер должен
    а) разбирать урл и выдирать из него параметры
    б) собирать урл на основе параметров и каких-то ещё признаков (опционально). например, могут быть именованные роуты
    не всё полезно, что в swap полезло
  • Timur

    Сообщения: 1068 Репутация: N Группа: Джедаи

    Spritz 25 февраля 2013 г. 23:24, спустя 1 день 14 часов 48 минут

    а есть ли готовая шкурка для роутинга? Без лишних наворотов. Мне не нужно все что дает фреймфорк.

    Возьми микрофреймворк какой-нибудь.
    Например, Silex. По-умолчанию, включает только самый базовый набор функций (роутинг, сервис-контейнер, события, работа с запросом/ответом). При этом, при необходимости можно парой строчек подключать компоненты Symfony 2 (шаблонизатор, формы, доктрину и т.д.).

Пожалуйста, авторизуйтесь, чтобы написать комментарий!