За последние 24 часа нас посетили 21953 программиста и 988 роботов. Сейчас ищут 659 программистов ...

FastRoute теперь не только быстрый, но и красивый

Тема в разделе "Решения, алгоритмы", создана пользователем artoodetoo, 26 фев 2016.

  1. artoodetoo

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

    С нами с:
    11 июн 2010
    Сообщения:
    11.072
    Симпатии:
    1.237
    Адрес:
    там-сям
    Кто не слышал про FastRoute, тому читать не обязательно.

    В общем, сделал транслятор, который готовит маршруты для FastRoute. То есть роутит по прежнему FastRoute, меняется только представление списка маршрутов с такого:
    Код (PHP):
    1. $dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) {
    2.     $r->addRoute('GET', '/users', 'get_all_users_handler');
    3.     $r->addRoute('GET', '/user/{id:\d+}', 'get_user_handler');
    4.     $r->addRoute('GET', '/articles/{id:\d+}[/{title}]', 'get_article_handler');
    5. // ...
    6. // ...
    7. });
    на такой:
    Код (PHP):
    1. $map = [
    2.     '/'                 => 'index',
    3.     '/forum/{id:\d+}'   => 'view_forums',
    4.     '/admin' => [
    5.         'allow' => 'ROLE_ADMIN',
    6.         '/'             => 'admin_dashboard',
    7.         '/updates'      => 'admin_updates',
    8.         '/user' => [
    9.             '/'         => 'admin_user_list',
    10.             '/{id:\d+}' => 'admin_user_view',
    11.             '/new'      => 'admin_user_new',
    12.         ],
    13.     ],
    14. ];
    15. $dispatcher = FastRoute\simpleDispatcher(new R2\Junc\RouteMapper($map));
    Конструктор RouteMapper принимает либо массив, либо имя php-файла, который должен вернуть массив.

    Профит:
    • Более естественный вид для "вложенных" маршрутов.
    • Не надо повторять "GET, GET, GET, GET…". Он по умолчанию.
    • Можно добавить опцию и она будет наследоваться дочками.
    • Ну и раз маршруты описываются без команд, статично, можно эту конфигурацию задавать в любом формате, хоть JSON, хоть YAML, лишь бы в массив конвертировалось.

    Прошу любить здесь: https://github.com/artoodetoo/junc

    Подключать в проект так:
    Код (Text):
    1. composer require artoodetoo/junc