Кто не слышал про FastRoute, тому читать не обязательно. В общем, сделал транслятор, который готовит маршруты для FastRoute. То есть роутит по прежнему FastRoute, меняется только представление списка маршрутов с такого: Код (PHP): $dispatcher = FastRoute\simpleDispatcher(function(FastRoute\RouteCollector $r) { $r->addRoute('GET', '/users', 'get_all_users_handler'); $r->addRoute('GET', '/user/{id:\d+}', 'get_user_handler'); $r->addRoute('GET', '/articles/{id:\d+}[/{title}]', 'get_article_handler'); // ... // ... }); на такой: Код (PHP): $map = [ '/' => 'index', '/forum/{id:\d+}' => 'view_forums', '/admin' => [ 'allow' => 'ROLE_ADMIN', '/' => 'admin_dashboard', '/updates' => 'admin_updates', '/user' => [ '/' => 'admin_user_list', '/{id:\d+}' => 'admin_user_view', '/new' => 'admin_user_new', ], ], ]; $dispatcher = FastRoute\simpleDispatcher(new R2\Junc\RouteMapper($map)); Конструктор RouteMapper принимает либо массив, либо имя php-файла, который должен вернуть массив. Профит: Более естественный вид для "вложенных" маршрутов. Не надо повторять "GET, GET, GET, GET…". Он по умолчанию. Можно добавить опцию и она будет наследоваться дочками. Ну и раз маршруты описываются без команд, статично, можно эту конфигурацию задавать в любом формате, хоть JSON, хоть YAML, лишь бы в массив конвертировалось. Прошу любить здесь: https://github.com/artoodetoo/junc Подключать в проект так: Код (Text): composer require artoodetoo/junc