lkt/http-router

LKT HTTP 路由器

1.0.12 2024-07-05 18:28 UTC

This package is auto-updated.

Last update: 2024-09-05 18:51:40 UTC


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

请注意,路由不能被声明两次。

路由可见性

所有路由都有两个替代构造函数来控制是否以公开或私有方式可用:onlyLoggedUsersonlyNotLoggedUsers

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();