An awesome router implementation with support for multiple routing engines, including `nikic/fast-route`.
Table of Contents
A collection of router implementations, inspired by the one you can find in the excellent Mezzio Routing Interfaces. Among them :
- a router is based on nikic/fast-route
- a router is based on a tree structure
- a router is based on a simple comparator
You need to provide a PSR-7 ServerRequestInterface in order to match the routes.
A PSR-7 ResponseInterface must be returned by the route handler.
You need PHP >= 8.2 to use Borsch\Router but the latest stable version of PHP is always recommended.
It also requires an implementation of PSR-7 HTTP Message.
The Laminas Diactoros Project is used for testing, and in the examples below.
Via composer :
composer require borschphp/router
require_once __DIR__.'/vendor/autoload.php';
$router = new \Borsch\Router\FastRouteRouter();
$router->addRoute(new \Borsch\Router\Route(
['GET'],
'/articles/{id:\d+}[/{slug}]',
new ArticleHandler(), // Instance of RequestHandlerInterface
'articles.id.title'
));
$server_request = \Laminas\Diactoros\ServerRequestFactory::fromGlobals();
// $route_result is an instance of RouteResultInterface
$route_result = $router->match($server_request);
// $route is an instance of RouteInterface (or false if no match)
$route = $route_result->getMatchedRoute();
if (!$route) {
return new \Laminas\Diactoros\Response('Not Found', 404);
}
// $response is an instance of ResponseInterface
$response = $route->getHandler()->handle($server_request);
// Send the response back to the client or other...| Router Name | Description | Cache | Speed | Speed with cache | Variables | Optional Parts |
|---|---|---|---|---|---|---|
FastRouteRouter |
A nikic/fast-route based router |
✅ | Medium | Fast | ✅ | ✅ |
TreeRouter |
A tree based router | ✅ | Fast | Very fast | ✅ | ❌ |
SimpleConditionalRouter |
A very simple comparator based router | ❌ | Very fast | ❌ | ❌ | ❌ |
This package uses Pest as test framework.
To run tests :
./vendor/bin/pest testsMutation testing has also been added to this package:
XDEBUG_MODE=coverage ./vendor/bin/pest --mutate --parallelContributions are what make the open source community such an amazing place to learn, inspire, and create. Any contributions you make are greatly appreciated.
If you have a suggestion that would make this better, please fork the repo and create a pull request. You can also simply open an issue with the tag "enhancement". Don't forget to give the project a star! Thanks again!
- Fork the Project
- Create your Feature Branch (
git checkout -b feature/AmazingFeature) - Commit your Changes (
git commit -m 'Add some AmazingFeature') - Push to the Branch (
git push origin feature/AmazingFeature) - Open a Pull Request
Distributed under the MIT License. See License File for more information.
A big thanks to these projects for inspiration or because they're used in this one: