corviz / router
基于正则表达式的路由系统,支持PHP 8.1+及原生中间件
v1.0
2023-01-24 17:54 UTC
Requires
- php: >=8.1
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']);
支持的方法
用于路由声明的支持方法有:get
、post
、put
、patch
、delete
、options
、head
或 any
每个代表一个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
方法在 prefix
和 group
之间一次性为多个路由分配中间件
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);