evgsavosin / choco-router
此包已被废弃,不再维护。未建议替代包。
基于正则表达式和缓存系统的现代 PHP 路由器。
2.1.1
2022-09-05 22:13 UTC
Requires
- php: >=8.1
Requires (Dev)
- phpunit/phpunit: ^9
This package is auto-updated.
Last update: 2024-05-06 01:57:05 UTC
README
基于正则表达式和缓存系统的现代 PHP 路由器。支持缓存驱动器:文件系统、APCu、Memcached。可以使用 PHP 8.0 的方法和属性定义路由。
要求
- PHP 8.1 或更高版本;
- APCu(可选);
- Memcached(可选)。
安装
通过 composer 安装
composer require evgsavosin/choco-router
使用方法
基本使用
使用时需要定义类的调用,例如使用 PSR-11 实现。
<?php declare(strict_types=1); require 'vendor/autoload.php'; use ChocoRouter\SimpleRouter; use ChocoRouter\HttpMethod; $router = new SimpleRouter(); $router->addRoute(HttpMethod::GET, '/foo', fn (): string => 'Foo!' ); $router->addRoute( HttpMethod::POST, '/foo/{bar}', fn (mixed $value): string => "Foo bar and {$value}!", ['bar' => '[0-9]+'] ); try { $router->resolve( $_SERVER['REQUEST_METHOD'], $_SERVER['REQUEST_URI'] )->callableResolve(function (mixed $handler, array $arguments): mixed { if (is_string($handler)) { [$controllerName, $methodName] = explode('@', $handler); // PSR-11 implementation for classes: controllers, actions and etc... } elseif (is_callable($handler)) { $handler(...$arguments); } }); } catch (HttpException $e) { if ($e->getCode() === HttpException::NOT_FOUND) { // Handle 404... } else if ($e->getCode() === HttpException::BAD_REQUEST) { // Handle 400... } }
路由定义
可以通过方法定义路由:addRoute(HttpMethod $httpMethod, string $uri, mixed $handler, array $parameters = []): void
。参数可以传递 {bar}
或 {bar?}
,使用正则表达式 ['bar' => '[0-9]+']
。实际示例
$router->addRoute(HttpMethod::GET, '/foo/{bar?}', 'foo-bar', ['bar' => '[0-9]+']);
问号表示参数是可选的。
使用方法 addGroup(string $prefix, callable $callback): void
定义路由组。实际示例
$router->addGroup('/gorge', function (RouteCollection $r): void { $router->addRoute(HttpMethod::GET, '/foo/{bar?}', 'foo-bar', ['bar' => '[0-9]+']); });
HTTP 方法
方法列表
HttpMethod::CONNECT HttpMethod::HEAD HttpMethod::GET HttpMethod::POST HttpMethod::PUT HttpMethod::DELETE HttpMethod::OPTIONS
配置
初始化简单路由器时可以设置配置。
$router = new SimpleRouter([ 'cacheDisable' => false, 'cacheDriver' => FileDriver::class, 'cacheOptions' => [] /* For memcached driver, there passed array of servers. For file driver, there passed path to cache directory. */ ]);
属性
路由器支持 PHP 8.0 的属性。示例
use App\Action\FooAction; $router = new SimpleRouter(); $router->load([FooAction::class]); $router->resolve(/*...*/)->callableResolve(/*...*/);
缓存
路由器支持具有定义的驱动程序的缓存系统。
ChocoRouter\Cache\Drivers\FileDriver::class
;ChocoRouter\Cache\Drivers\ApcuDriver::class
;ChocoRouter\Cache\Drivers\MemcachedDriver::class
.
要使用缓存,将定义的路由移动到缓存回调。
$router = new SimpleRouter([ 'cacheDriver' => FileDriver::class ]); $router->cache(static function (RouteCollection $r): void { $r->addRoute(HttpMethod::GET, '/foo/{bar}', App\Actions\FooAction::class, ['bar' => '[0-9]+']); }); $router->resolve(/*...*/)->callableResolve(/*...*/);
贡献
作者尚未有时间编写说明,但任何 pull request 或问题都会很高兴。
许可
Choco Router 使用 MIT 许可。