evgsavosin/choco-router

此包已被废弃,不再维护。未建议替代包。

基于正则表达式和缓存系统的现代 PHP 路由器。

2.1.1 2022-09-05 22:13 UTC

This package is auto-updated.

Last update: 2024-05-06 01:57:05 UTC


README

PHPUnit Tests Stable PHP License

基于正则表达式和缓存系统的现代 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 许可。