attribute-router / router
AttributeRouter is a lightweight and intuitive routing solution for PHP applications
Installs: 29
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 1
Forks: 0
Open Issues: 0
pkg:composer/attribute-router/router
Requires
- php-di/php-di: ^7.0
Requires (Dev)
- phpunit/phpunit: ^11.4
README
composer require attribute-router/router
Controller
declare(strict_types=1); namespace Controller; use AttributeRouter\Route; use AttributeRouter\RouteGroup; #[RouteGroup(path: '/admin', priority: 5)] class HomeController { #[Route( path: '/edit/{id}/{uuid?}', methods: ['GET'], name: 'edit', patterns: ['id' => '[0-9]+'], priority: 10 )] public function edit(int $id, ?string $uuid = null) { // } }
Initialization
require '../vendor/autoload.php'; use Controller\HomeController; use AttributeRouter\Router; use DI\Container; use Controller\TestController; $container = new Container; $router = $container->get(Router::class); $router->registerRoutes([ HomeController::class, TestController::class, ]); $requestUri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); $requestMethod = $_SERVER['REQUEST_METHOD']; $router->dispatch($requestUri, $requestMethod); $router->invokeController();
It is also possible to specify languages. But it should be specified before registering the controllers. In this case, the parameter /{locale?}/ will be automatically added to the beginning of all routes. A question mark means that this is an optional parameter. For example in the route /blog/123, would mean the default language, route /fr/blog/123, the French version.
$container = new Container; $router = $container->get(Router::class); $router->setDefaultLocale('en')->setLocales(['en', 'ru', 'fr']); $router->registerRoutes([ HomeController::class, TestController::class, ]); $requestUri = parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH); $requestMethod = $_SERVER['REQUEST_METHOD']; $router->dispatch($requestUri, $requestMethod); $router->invokeController();
Cached routes can be forwarded. This method is shown for familiarization. You can use special classes for this.
$container = new Container; $router = $container->get(Router::class); $router->registerRoutes([ HomeController::class, TestController::class, ]); file_put_contents('cache.txt', serialize($router->getRoutes()));
If routes are cached, you can do without registering controllers
$container = new Container; $router = $container->get(Router::class); $data = unserialize(file_get_contents('cache.txt')); $router->setRoutes($data); $router->dispatch($requestUri, $requestMethod); $router->invokeController();
Current route
var_dump($router->getCurrent());
All routes
var_dump($router->getRoutes());
Register a new named parameter
$router->setAlias(alias: 'username', pattern: '[a-zA-Z0-9-_]+');
Get all named parameter
$router->getAliases();