Simple router compatible with the PSR-7
Роутер предназначен для передачи управления обработчику запроса по входному http запросу. Весь роутинг делиться на небольшие компоненты, которые занимаются определенной задачей.
Объект, который храни в себе путь/регулярку и ряд ограничений на http метод или переменную запроса, а также обработчик, который нужно вызвать для этого пути.
$route2 = new Route('/blog/{id}/', $endPoint2, ['id' => '\d+']);
$route = new Route('/{lang}/users/{id}/{action}/', $endPoint, [
'lang' => 'ru|en',
'action' => '[a-z0-9_]+',
'id' => '\d+',
], Route::ONLY_XHR);Объект для работы с коллекцией роутов. Роуты добавляются в коллекцию роутов с определенным приоритетом.
Метод getRoutes возвращает массив всех роутов отсортированных по приоритету.
Объект осуществляет поиск активного роута на основе соллекции роутов и текущего uri запроса. Простой поиск первого совпадения (наиболее приоритетного роута):
$matcher = new Matcher();
$uri = '/profile/23/';
$routes = ...; // CollectionRoute instance
$endPoint = $matcher->matchFirst($routes, $uri); // IPoint instanceМожно получить все endPoint объекты, а не только первый. Метод match возвращает генератор. Через генератор достаются все объекты endPoint совпавших роутов.
foreach ($matcher->match($routes, $uri) as $endPoint) {
...
}Брагодаря такой конструкции, можно выполнять маленькие обработчики друг за другом и др.
Все обработчики поддерживают интерфейс IPoint и служат для создания обработчика запроса с нужными параметрами и вызова обработчика с нужными параметрами. В комплекте идет ряд реализаций endPoint, которые могут помочь коротко и лаконично описать правила роутинга вашего приложения.
Предназначен для вызова любого обработчика callable типа.
$endPoint = new Point\CallablePoint([
'callable' => function () {
return '404';
}
]);Явно задает класс контроллера и метод.
$endPoint = new Point\ControllerPoint([
'controller' => 'CollectionRouteTest',
'action' => 'action'
]);Класс контроллера формируется динамически из переменной запрос :controller, которая является обязательной.
Action берется из переменной запроса :action (по умолчанию index)
$endPoint = new Point\DynamicController([
'prefix' => 'Demo'
]);Похож на DynamicController за исключением того, что контрллер указывается явно, а не берется динамически из переменной запроса :controller.
$endPoint = new Point\ControllerDynamicAction([
'controller' => SomeController::class
]);Охватить специфику каждого проекта очень сложно и это будет избыточно. Вы можете легко создать более специфичный класс типа IPoint на основе базовых классов или с нуля. Примером такого класса для своего проекта служит класс DynamicBundleController. Он призван показать как легко и просто делаются endPoint-ы под свой проект, если дефолтные по какой-то причине не подошли.