ФорумПрограммированиеПыхнуть хотите?Готовые решения → Pyha\Routing

Pyha\Routing

  • Абырвалг

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

    Spritz 27 октября 2010 г. 16:03

    В очередной раз реализовываю роутинг.

    сорцы

    Z:\home\localhost\pyha\tests>phpunit Pyha\Tests\Component\Routing\
    PHPUnit 3.5.2 by Sebastian Bergmann.

    …………………………………………

    Time: 0 seconds, Memory: 5.00Mb

    OK (48 tests, 99 assertions)


    примеры использования завтра
  • Givi

    Сообщения: 2284 Репутация: N Группа: Адекваты

    Spritz 28 октября 2010 г. 2:29, спустя 10 часов 26 минут 3 секунды

    я нихуя не понимаю в этих всех цифрах, потому хочу спросить: 5Мб памяти под что уходит, под твой роутер? Если да. то это пиздец, а если нет, то вопрос: нахуй вообще приводить эти непонятно-что-значащие цифры?
  • Troy

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

    Spritz 28 октября 2010 г. 2:39, спустя 9 минут 20 секунд

    джемс примеров)
  • phpdude

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

    Spritz 28 октября 2010 г. 3:15, спустя 36 минут 8 секунд

    Pyha\Routing

    какое отношение это г имеет к пыхе?
    Сапожник без сапог
  • Абырвалг

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

    Spritz 28 октября 2010 г. 5:06, спустя 1 час 50 минут 47 секунд

    Givi, это все phpunit, сам роутинг жрет куда меньше


    Troy, будут, вечером
    Спустя 59 сек.
    phpdude, я просто взял и нагло использовал название пыхи для ребрендинга своих BL
  • phpdude

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

    Spritz 28 октября 2010 г. 5:07, спустя 1 минуту 22 секунды

    phpdude, я просто взял и нагло использовал название пыхи для ребрендинга своих BL

    а кто тебе давал на это право?)))) не, ну ты делай делай, потом я зарегаю торговую марку Pyha и буду продавать твой гавнокод :D
    Сапожник без сапог
  • Абырвалг

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

    Spritz 29 октября 2010 г. 4:58, спустя 23 часа 50 минут 47 секунд

    Итак, Pyha\Routing - компонент для разбора URL и их генерации.

    Вы все не маленькие, с autoload'ом думаю разберетесь сами. Можете свой autoload использовать или гляньте tests/bootstrap.php, там все предельно ясно.

    Перво-наперво нужно создать объект Request. В нем хранится информация о GET-параметрах и некоторые значения SERVER.

    use Pyha\Component\Routing;

    $serverParams = array(
    'method'    => 'post',
    'host'      => 'pyha.localhost',
    'path'      => '/', // REQUEST_URI
    'is_secure' => false,
    'port'      => 80,
    'is_ajax'   => false,
    'base_url'  => 'http://pyha.localhost/'
    );
    $request = new Routing\Request($serverParams, $_GET);

    осторожно - вы сами обрезаете часть REQUEST_URI, в которой находится base_path (это актуально когда сайт находится не в корне а в подпапке).
    Потом через этот же $request можно будет получить совпавшие параметры (toArray(), getQueryParam($key))

    // создаем объект роутера
    $router = new Routing\Router($request);
    // добавляем стандартные ресолверы
    $router
    ->addRouteResolvers(array(
    new Routing\RouteResolver_Static(),
    new Routing\RouteResolver_Regexp(),
    new Routing\RouteResolver_Modular(),
    new Routing\RouteResolver_Hostname(),
    new Routing\RouteResolver_Chain()
    ));

    Ресолвер непосредственно занимается проверкой совпадения маршрута и генерацией URL'а. Вы можете написать свои ресолверы, для этого есть соотв. интерфейс или даже абстрактный класс.

    Роуты задаются массивом. Обязательный параметр - type (static/regexp/…) - нужно ж знать каким ресолвером проверять совпадение.
    $router
    ->addRoute('account.login', array(
    'type'   => 'static',
    'uri'    => 'login',
    'module' => 'account',
    ));

    Кроме того для разных типов роутов свои обязательные параметры, накладываемые ресолвером. Например uri для статического, pattern, pattern_reverse для регекспного.

    Дополнительно маршруту можно задать module, controller, action. Некоторым можно задать еще params (совпавшие параметры) query (просто параметры).

    После того, как добавили все нужные нам роуты - ищем совпавший маршрут.
    $router->match();

    возвращает bool. После этого в нашем $request находятся параметры из совпавшего роута. Или не находятся, если ничего не совпало. Можно узнать какой же именно маршрут совпал при помощи $router->getMatchedRouteName().

    Немного о chain ресолвере: он предназначен для разбора разных частей $request. Создаем цепочку правил разбора. То есть нельзя одновременно проверять совпадения в path, но можно проверить hostname и path.

    Например мы хотим вынести на субдомен форум. Создаем соответствующий маршрут

    $forumRoute = array(
    'type'            => 'hostname',
    'pattern'         => 'forum.pyha.localhost',
    'reverse_pattern' => 'forum.pyha.localhost',
    'module'          => 'forum',
    ),
    $router
    ->addRoutes(array(
    'forum.board.view' => array(
    'type'   => 'chain',
    'routes' => array(
    $forumRoute, // вот она, цепочка правил
    array(
    'type'       => 'regexp',
    'pattern'    => '(\d+)',
    'reverse_pattern' => '%d',
    'params'     => array('board_id'),
    'controller' => 'board',
    'action'     => 'view'
    ),
    ),
    ),
    'forum.topic' => array(
    'type'   => 'chain',
    'routes' => array(
    $forumRoute,
    array(
    'type'       => 'regexp',
    'pattern'    => '(\d+)/(\d+)', // шаблон для поиска совпадения урл
    'reverse_pattern' => '%d/%d', // шаблон для генерации урл
    'params'     => array('board_id', 'topic_id'), // параметры, которые должны совпасть
    'controller' => 'topic',
    'action'     => 'view'
    ),
    ),
    ),
    );


    итак, вернемся к нашему $serverParams, с которого все начиналось.

    $serverParams['host'] = 'forum.pyha.localhost';
    $serverParams['path'] = '/foo';
    // ничего не совпадет

    $serverParams['host'] = 'forum.pyha.localhost';
    $serverParams['path'] = '/12';
    // совпадет маршрут forum.board.view


    теперь в $request будет находиться такое
    array(
    '_module'     => 'forum',
    '_controller' => 'board',
    '_action'     => 'view',
    'board_id'    => 12
    );


    // а при раскладе
    $serverParams['host'] = 'forum.pyha.localhost';
    $serverParams['path'] = '/12/41';
    // будет
    array(
    '_module'     => 'forum',
    '_controller' => 'topic',
    '_action'     => 'view',
    'board_id'    => 12,
    'topic_id'    => 41
    );
    Спустя 224 сек.
    обратную генерацию URL рассмотрим несколько позже
  • phpdude

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

    Spritz 29 октября 2010 г. 5:08, спустя 10 минут 2 секунды

    сложно чото очень)
    Сапожник без сапог
  • Sinkler

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

    Spritz 29 октября 2010 г. 6:11, спустя 1 час 2 минуты 59 секунд

    гляньте tests/bootstrap.php

    где смотреть?
  • Абырвалг

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

    Spritz 29 октября 2010 г. 6:18, спустя 7 минут 21 секунду

    Sinkler, https://bitbucket.org/Koc/pyha/src/tip/tests/bootstrap.php
    Спустя 129 сек.
    хули тут сложного? это очень простая система роутинга.

    Я специально не делал никаких xml/yaml/ini лоадеров и дамперов, так как считаю что это проблема другого слоя
    Спустя 28 сек.
    у нее даже нет никаких зависимостей от других компонентов/либ
    Спустя 234 сек.
    а если нет, то вопрос: нахуй вообще приводить эти непонятно-что-значащие цифры?

    это результаты юнит-тестов. На картинке диаграммы покрытия кода тестами
  • Troy

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

    Spritz 29 октября 2010 г. 6:32, спустя 13 минут 31 секунду

    Нормально все, достаточно мощная библиотека, даже + дам, много параметров, просто надо немного допилить и всё
  • Troy

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

    Spritz 29 октября 2010 г. 6:43, спустя 11 минут 26 секунд

    В Yii кстати отличный роутинг, например можно сделать так:

    'http://<user:[^www]>.site.ru/<action>' => 'user/<action>'

    В $_GET['user'] будет субдомен
  • soul

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

    Spritz 29 октября 2010 г. 16:53, спустя 10 часов 9 минут 30 секунд

    я вот не понял зачем резолверы, чем это лучше обычного роутера.
  • krasun

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

    Spritz 30 октября 2010 г. 2:40, спустя 9 часов 47 минут 48 секунд

    Зачем позорить имя Pyha?

    Подъеб конечно.

    Сравни с http://zendframework.com/manual/en/zend.controller.router.html в чем отличие?
  • Абырвалг

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

    Spritz 30 октября 2010 г. 9:08, спустя 6 часов 27 минут 52 секунды

    добавил поддержку префиксов и суффиксов
    Спустя 47 сек.
    $routeParams = array(
    'uri' => 'blog',
    'module' => 'blog',
    'suffix' => '.html'
    );
    Спустя 48 сек.
    зы: вроде бы роутер чувствителен к "/" на конце, нужно добавить тесты по этому поводу

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