Этот сайт не наркоманов. Это сайт программистов.

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Пыха информатор 3.1
Еще более удобное оповещение о флуде!

Краснодарское время: 25 Май, 2012, 05:14:49

Страниц: [1] 2 3 ... 5
Печать
Автор Тема: Pyha\Routing  (Прочитано 1621 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Абырвалг    ↓ 
28 Октябрь, 2010, 12:03:54
НЕ ХУЕТА! ХУЕТА!

PHP Infected, симфоеб, маконенавистник
Группа: Джедаи

Карма: 80
Сообщений: 6096
Сила слова: 1.31

В очередной раз реализовываю роутинг.
 
сорцы
 
Text
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)

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


* FireShot capture #387.png (38.41 Кб, 1262x425 - просмотрено 136 раз.)
Записан

PHP does the job since 1995
Пожалуйста, не надо делать двойные клики по ссылкам. Это создает избыточную нагрузку на сервер
Givi    ↓ 
28 Октябрь, 2010, 10:29:57 , спустя 10 часов 26 минут 3 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: Адекваты

Карма: 42
Сообщений: 2305
Сила слова: 1.82

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

Все, что говорят другие - неправда! До тех пор, пока ты сам в это не поверишь.
Если человек дурак, то... чур это не я!
Troy    ↓ 
28 Октябрь, 2010, 10:39:17 , спустя 9 минут 20 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Джедаи

Карма: 45
Сообщений: 2393
Сила слова: 1.88

джемс примеров)
Записан

phpdude    ↓ 
28 Октябрь, 2010, 11:15:25 , спустя 36 минут 8 секунд
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 344
Сообщений: 20790
Сила слова: 1.65

Pyha\Routing
какое отношение это г имеет к пыхе?
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
Абырвалг    ↓ 
28 Октябрь, 2010, 01:06:12 , спустя 1 час 50 минут 47 секунд
НЕ ХУЕТА! ХУЕТА!

PHP Infected, симфоеб, маконенавистник
Группа: Джедаи

Карма: 80
Сообщений: 6096
Сила слова: 1.31

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

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

PHP does the job since 1995
Пожалуйста, не надо делать двойные клики по ссылкам. Это создает избыточную нагрузку на сервер
phpdude    ↓ 
28 Октябрь, 2010, 01:07:34 , спустя 1 минуту 22 секунды
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 344
Сообщений: д-о-х-у-я!
Сила слова: 1.65

phpdude, я просто взял и нагло использовал название пыхи для ребрендинга своих BL
а кто тебе давал на это право?)))) не, ну ты делай делай, потом я зарегаю торговую марку Pyha и буду продавать твой гавнокод :D
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
Абырвалг    ↓ 
29 Октябрь, 2010, 12:58:21 , спустя 23 часа 50 минут 47 секунд
НЕ ХУЕТА! ХУЕТА!

PHP Infected, симфоеб, маконенавистник
Группа: Джедаи

Карма: 80
Сообщений: 6096
Сила слова: 1.31

Итак, Pyha\Routing - компонент для разбора URL и их генерации.
 
Вы все не маленькие, с autoload'ом думаю разберетесь сами. Можете свой autoload использовать или гляньте tests/bootstrap.php, там все предельно ясно.
 
Перво-наперво нужно создать объект Request. В нем хранится информация о GET-параметрах и некоторые значения SERVER.
 
PHP
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))
 
PHP
// создаем объект роутера
$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/...) - нужно ж знать каким ресолвером проверять совпадение.
PHP
$router
    ->addRoute('account.login', array(
        'type'   => 'static',
        'uri'    => 'login',
        'module' => 'account',
    ));
 
Кроме того для разных типов роутов свои обязательные параметры, накладываемые ресолвером. Например uri для статического, pattern, pattern_reverse для регекспного.
 
Дополнительно маршруту можно задать module, controller, action. Некоторым можно задать еще params (совпавшие параметры) query (просто параметры).
 
После того, как добавили все нужные нам роуты - ищем совпавший маршрут.
PHP
$router->match();
возвращает bool. После этого в нашем $request находятся параметры из совпавшего роута. Или не находятся, если ничего не совпало. Можно узнать какой же именно маршрут совпал при помощи $router->getMatchedRouteName().
 
Немного о chain ресолвере: он предназначен для разбора разных частей $request. Создаем цепочку правил разбора. То есть нельзя одновременно проверять совпадения в path, но можно проверить hostname и path.
 
Например мы хотим вынести на субдомен форум. Создаем соответствующий маршрут
 
PHP
$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, с которого все начиналось.
PHP

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

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

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

PHP does the job since 1995
Пожалуйста, не надо делать двойные клики по ссылкам. Это создает избыточную нагрузку на сервер
phpdude    ↓ 
29 Октябрь, 2010, 01:08:23 , спустя 10 минут 2 секунды
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 344
Сообщений: д-о-х-у-я!
Сила слова: 1.65

сложно чото очень)
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
Status    ↓ 
29 Октябрь, 2010, 02:08:14 , спустя 59 минут 51 секунду
НЕ ХУЕТА! ХУЕТА!

Редкостная сволочь
Группа: Джедаи

Карма: 57
Сообщений: 1447
Сила слова: 3.94

Красота в простоте, а это как то уж слишком завернуто...
Записан

Заткнись говно, я воевал!
Sinkler    ↓ 
29 Октябрь, 2010, 02:11:22 , спустя 3 минуты 8 секунд
НЕ ХУЕТА! ХУЕТА!

Похуй, пляшем!
Группа: Джедаи

Карма: 73
Сообщений: 6805
Сила слова: 1.07

гляньте tests/bootstrap.php
где смотреть?
Записан

Абырвалг    ↓ 
29 Октябрь, 2010, 02:18:43 , спустя 7 минут 21 секунду
НЕ ХУЕТА! ХУЕТА!

PHP Infected, симфоеб, маконенавистник
Группа: Джедаи

Карма: 80
Сообщений: 6096
Сила слова: 1.31

Sinkler, https://bitbucket.org/Koc/pyha/src/tip/tests/bootstrap.php
Спустя 2 минуты 9 секунд добавил
хули тут сложного? это очень простая система роутинга.
 
Я специально не делал никаких xml/yaml/ini лоадеров и дамперов, так как считаю что это проблема другого слоя
Спустя 28 секунд добавил
у нее даже нет никаких зависимостей от других компонентов/либ
Спустя 3 минуты 54 секунды добавил
а если нет, то вопрос: нахуй вообще приводить эти непонятно-что-значащие цифры?
это результаты юнит-тестов. На картинке диаграммы покрытия кода тестами
Записан

PHP does the job since 1995
Пожалуйста, не надо делать двойные клики по ссылкам. Это создает избыточную нагрузку на сервер
Status    ↓ 
29 Октябрь, 2010, 02:28:28 , спустя 9 минут 45 секунд
НЕ ХУЕТА! ХУЕТА!

Редкостная сволочь
Группа: Джедаи

Карма: 57
Сообщений: 1447
Сила слова: 3.94

Насяйника не сердись:) Лыба харосый:)
 
Это я так смотрю как одной фразой серьезную тему превратить в цирк))))
Записан

Заткнись говно, я воевал!
Troy    ↓ 
29 Октябрь, 2010, 02:32:14 , спустя 3 минуты 46 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Джедаи

Карма: 45
Сообщений: 2393
Сила слова: 1.88

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

Troy    ↓ 
29 Октябрь, 2010, 02:43:40 , спустя 11 минут 26 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Джедаи

Карма: 45
Сообщений: 2393
Сила слова: 1.88

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

'http://<user:[^www]>.site.ru/<action>' => 'user/<action>'
 
В $_GET['user'] будет субдомен
Записан

KaFe    ↓ 
30 Октябрь, 2010, 12:34:01 , спустя 9 часов 50 минут 21 секунду
НЕ ХУЕТА! ХУЕТА!

Группа: Сраный Тролль

Карма: -13346
Сообщений: 1727
Сила слова: -772.79

Объясните мне вообще зачем  нужна эта библа, вообще какой в ней смысл?
Я буду горячей, чем испанские перцы, если ее буду использовать?
Записан

Страниц: [1] 2 3 ... 5
Печать
 

Перейти в:  

Этот топик скрыли: adw0rd, Frozzeg, mario