lkt / http-router
LKT HTTP 路由器
Requires
- php: >=8.1.0
- lkt/http-response: ^2.0
- lkt/templates: ^2.0
- nikic/fast-route: ^1.3
Requires (Dev)
- phpunit/phpunit: ^9.5
- symfony/var-dumper: ^6.2
README
此软件包旨在处理 HTTP 请求。
所有由 Router
使用的 Response
对象都在 lkt/http-response 中描述。
此软件包实现了 nikic/FastRoute,因此所有路由的动态参数都可用。
安装
composer require lkt/http-router
注册路由
注册新路由就像实例化一个类一样简单。它接受两个参数:完整路由和一个带有 Route
处理器的 callable。
use Lkt\Http\Routes\GetRoute; use Lkt\Http\Routes\PostRoute; use Lkt\Http\Routes\PutRoute; use Lkt\Http\Routes\PatchRoute; use Lkt\Http\Routes\DeleteRoute; GetRoute::register('/blog/{id}', [YourController::class, 'handler']); // Route only can be accessed by GET PostRoute::register('/blog', [YourController::class, 'handler']); // Route only can be accessed by POST PutRoute::register('/blog/{id}', [YourController::class, 'handler']); // Route only can be accessed by PUT PatchRoute::register('/blog/{id}', [YourController::class, 'handler']); // Route only can be accessed by PATCH DeleteRoute::register('/blog/{id}', [YourController::class, 'handler']); // Route only can be accessed by DELETE
请注意,路由不能被声明两次。
路由可见性
所有路由都有两个替代构造函数来控制是否以公开或私有方式可用:onlyLoggedUsers
和 onlyNotLoggedUsers
。
use Lkt\Http\Routes\GetRoute; use Lkt\Http\Routes\PostRoute; use Lkt\Http\Routes\PutRoute; use Lkt\Http\Routes\PatchRoute; use Lkt\Http\Routes\DeleteRoute; GetRoute::onlyLoggedUsers('/blog/{id}', [YourController::class, 'handler']); PostRoute::onlyLoggedUsers('/blog', [YourController::class, 'handler']); PutRoute::onlyLoggedUsers('/blog/{id}', [YourController::class, 'handler']); PatchRoute::onlyLoggedUsers('/blog/{id}', [YourController::class, 'handler']); DeleteRoute::onlyLoggedUsers('/blog/{id}', [YourController::class, 'handler']); GetRoute::onlyNotLoggedUsers('/public-blog/{id}', [YourController::class, 'handler']); PostRoute::onlyNotLoggedUsers('/public-blog', [YourController::class, 'handler']); PutRoute::onlyNotLoggedUsers('/public-blog/{id}', [YourController::class, 'handler']); PatchRoute::onlyNotLoggedUsers('/public-blog/{id}', [YourController::class, 'handler']); DeleteRoute::onlyNotLoggedUsers('/public-blog/{id}', [YourController::class, 'handler']);
确定用户是否已登录
Router
包含一个方法,该方法接受一个用于检查用户是否已登录的 callable 函数。
此函数必须返回一个 bool
值(true
表示用户已登录)。
这样,Router
不会修改您的逻辑。
use Lkt\Http\Router; // With a function Router::setLoggedUserChecker(function(){ // Do your stuff return true; }); // With a callable array Router::setLoggedUserChecker([YourLoginController::class, 'yourLoginCheckerMethod']);
为 Route
指定自定义登录检查器
如果您有一个存在多种登录方式的环境,您可以指定一个自定义登录检查器。
use Lkt\Http\Routes\GetRoute; GetRoute::onlyLoggedUsers('/blog', [YourController::class, 'handler']) ->setLoggedUserChecker([YourLoginController::class, 'yourSpecificLoginCheckerMethod']);
进一步限制对路由的访问
每个 Route
都可以添加一些访问检查器以确定它是否可访问。
use Lkt\Http\Routes\GetRoute; GetRoute::onlyLoggedUsers('/blog', [YourController::class, 'handler']) ->addAccessChecker([YourLoginController::class, 'checkThisUserIsAdmin']);
访问检查器处理程序将接收到一个包含所有请求变量的数组,并且可以有不同的返回值。
- 返回一个
Response
实例将使Router
分发此响应。 false
,表示用户不允许访问,并且Router
将分发一个禁止响应。void
,访问检查器不限制对数据的访问,并且Router
将按常规工作。
路由处理程序
Router
期望所有路由都返回一个 Response
实例(请参阅 lkt/http-response)。
每个处理程序将接收一个包含所有请求变量的数组作为第一个参数。
您的Controller.php的一个示例
use Lkt\Http\Response; class YourController { public static function index(array $params = []): Response { return Response::ok(['message' => 'everything ok!']); } } // ... // And that method would be mapped this way: GetRoute::onlyLoggedUsers('/blog', [YourController::class, 'index']);
路由解析
在您的 index.php
中,简单地添加以下内容
use Lkt\Http\Router; Router::dispatch();
自动检测您正在发送 JSON、HTML、文件等,并处理正确的头。
此外,dispatch
方法将结束脚本执行。
如果您有一个现有的路由引擎并想逐步迁移,您可以获取响应并使用它。请参阅 lkt/http-response 了解可以做什么 Response
实例,例如,如何发送 HTTP 头。
use Lkt\Http\Router; Router::getResponse();
全局强制响应
此功能在您希望返回维护状态、阻止特定 IP 地址或需要发送相同 Response
而不管访问哪个路由的情况下非常有用。
use Lkt\Http\Router; use Lkt\Http\Response; $response = Response::serviceUnavailable('Server under maintenance'); Router::forceGlobalResponse($response);
令牌检测
Router
可以为您提供 HTTP_TOKEN 或 Bearer Token。两种方法都在令牌未定义时返回 null。
use Lkt\Http\Router; Router::getBearerToken(); Router::getTokenHeader();