corviz/router

基于正则表达式的路由系统,支持PHP 8.1+及原生中间件

v1.0 2023-01-24 17:54 UTC

This package is auto-updated.

Last update: 2024-08-27 17:41:12 UTC


README

基于正则表达式的路由系统,支持PHP 8.1+及原生中间件

如何安装

composer install corviz/router

路由门面(单例模式)

这是最常见的使用场景,因此我们提供了一个现成的门面。

首先,您需要声明应用程序的路由

use Corviz\Router\Facade\RouterFacade as Router;

/*
 * Application routes
 */
Router::get('/', function() {
    return 'Hello world!';
});

Route::get('/user/(\d+)', function(int $id){
    return "Show information for user $id";
});

然后,执行并输出结果。

echo Router::dispatch();
!Router::found() && http_response_code(404);

注意: Router::dispatch() 返回控制器返回的值(在这个例子中是一个字符串)。

控制器类

如果您使用类作为控制器,则在路由声明中,第二个参数使用一个数组。

示例控制器类

namespace MyApplication;

class UserController 
{
    public function show(int $id)
    {
        //Search for user information in the database
        //...
        
        return $user;
    }
}

上述控制器的路由。

Router::get('/user/(\d+)', [\MyApplication\User::class, 'show']);

支持的方法

用于路由声明的支持方法有:getpostputpatchdeleteoptionsheadany

每个代表一个HTTP方法,除了 any,它将处理所有方法

use Corviz\Router\Facade\RouterFacade as Router;

Router::get('/user/(\d+)', function(int $id) { /*...*/ });
Router::post('/user/new', function() { /*...*/ });
Router::delete('/user/(\d+)', function(int $id) { /*...*/ });

中间件

中间件负责请求的预处理和后处理。我们将接受可调用者或扩展 Corviz\Router\Middleware 的类作为您的应用程序的中间件。

use Corviz\Router\Middleware;

class AcceptJsonMiddleware extends Middleware
{
    public function handle(Closure $next): mixed
    {
        //Interrupts in case wrong content-type was sent
        if (!$_SERVER['CONTENT_TYPE'] != 'application/json') {
            return 'Invalid content type';
        }
        
        return $next(); //Proceed with the request
    }
}

要分配一个中间件,请按以下方式操作

use Corviz\Router\Facade\RouterFacade as Router;

Router::any( /*...*/ )
    ->middleware(AcceptJsonMiddleware::class);

或者如果您想一次性分配多个中间件

use Corviz\Router\Facade\RouterFacade as Router;

Router::any( /*...*/ )
    ->middleware([Middleware1::class, Middleware2::class]);

分组

要分组多个路由,您必须首先使用 prefix 方法,然后只需使用 group 与携带这些子路由的可调用者即可。例如

use Corviz\Router\Facade\RouterFacade as Router;

Router::prefix('user')->group(function() {
    Router::get('list', function() { /**/ });    
    Router::get('(\d+)', function(int $id) { /**/ });    
    Router::post('new', function() { /**/ });    
    Router::patch('(\d+)/update', function(int $id) { /**/ });    
    Router::delete('(\d+)/delete', function(int $id) { /**/ });    
});

这将创建以下路由

  • user/list
  • user/(\d+)
  • user/new
  • user/(\d+)/update
  • user/(\d+)/delete

分组中间件

您可以使用 middleware 方法在 prefixgroup 之间一次性为多个路由分配中间件

use Corviz\Router\Facade\RouterFacade as Router;

Router::prefix('api')
    ->middleware(CheckTokenMiddleware::class)
    ->middleware(AcceptJsonMiddleware::class)
    ->group(function() { /* ... */ });

手动确定当前路径和方法

‘dispatch()’ 方法从 $_SERVER 超全局变量读取‘REQUEST_METHOD’和‘REQUEST_URI’索引以确定哪个路由将被执行。

但是,您可能想手动通知它。如果是这样,只需按以下方式提供

$method = 'GET'; //or POST, PUT, PATCH, DELETE...
$path = 'users/1/show';

$output = Router::dispatch($method, $path);

多个路由器

如果您必须出于某种原因使用多个路由器,只需使用类Dispatcher,而不是路由门面即可。

use Corviz\Router\Dispatcher;

$router = new Dispatcher();
$router2 = new Dispatcher();
$router3 = new Dispatcher();
//so on...

然后,像往常一样注册并执行路由。

$router1->get('route1', /* ... */);
$router1->prefix('group1')->group(function() use (&$router1){
    $router1->get('route2', /* ... */);
    $router1->get('route3', /* ... */);
});

echo $router1->dispatch();
!$router1->found() && http_response_code(404);