bittyphp / middleware
PSR-15 HTTP 中间件实现。
此包尚未发布任何版本,且可用的信息很少。
README
Bitty 包含一个 PSR-15 中间件实现。
安装
最好使用 Composer 进行安装。
$ composer require bittyphp/middleware
官方中间件
Bitty 只包含满足最基本需求的中间件。然而,通过使用 MiddlewareInterface
,您可以构建对几乎所有可以想到的内容的支持。
基本用法
要在 Bitty 之外使用 Bitty 的中间件,设置相当简单。每个调用的详细信息将在稍后解释。
<?php use Bitty\Middleware\MiddlewareChain; // Create a middleware chain. $middleware = new MiddlewareChain(); // Optional: Override the default handler. $middleware->setDefaultHandler(...); // Optional: Add your custom middleware. $middleware->add(...); $middleware->add(...); $middleware->add(...); // Process the request. $response = $middleware->handle($request);
默认处理器
默认处理器是在没有其他东西处理请求时被调用的。它必须是 Psr\Http\Server\RequestHandlerInterface
的一个实例。默认情况下,这只是一个返回 404 未找到响应的类。您可以覆盖默认处理器以使其成为任何您想要的,但您不必这样做。
有关更多信息,请参阅创建请求处理器的部分。
<?php use Bitty\Middleware\MiddlewareChain; use Psr\Http\Server\RequestHandlerInterface; /** @var RequestHandlerInterface */ $defaultHandler = ...; $middleware = new MiddlewareChain($defaultHandler);
您也可以在构建中间件链之后设置默认处理器。
<?php use Bitty\Middleware\MiddlewareChain; use Psr\Http\Server\RequestHandlerInterface; /** @var RequestHandlerInterface */ $defaultHandler = ...; $middleware = new MiddlewareChain(); $middleware->setDefaultHandler($defaultHandler);
添加中间件
添加的所有中间件都必须实现 Psr\Http\Server\MiddlewareInterface
。中间件链使用先入先出的方式构建。这意味着您添加的第一个中间件将是第一个被调用的中间件。您可以使用此方法按您希望的顺序组织您的中间件。
有关更多信息,请参阅创建中间件的部分。
<?php use Bitty\Middleware\MiddlewareChain; use Psr\Http\Server\MiddlewareInterface; $middleware = new MiddlewareChain(); /** @var MiddlewareInterface */ $someMiddleware = ...; $middleware->add($someMiddleware);
处理请求
最后一步是处理请求。中间件链将处理任何实现 Psr\Http\Message\ServerRequestInterface
的请求。这将产生一个 Psr\Http\Message\ResponseInterface
,然后您可以将其发送给用户。
<?php use Bitty\Middleware\MiddlewareChain; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; $middleware = new MiddlewareChain(); /** @var ServerRequestInterface */ $request = ...; /** @var ResponseInterface */ $response = $middleware->handle($request);
创建请求处理器
如果您希望在没有任何中间件处理请求的情况下返回简单的 404 未找到响应,您必须构建自定义请求处理器。您可以使用此功能返回错误页面、将用户重定向到搜索页面或显示帮助页面。请求处理器可以是任何实现 Psr\Http\Server\RequestHandlerInterface
的类。
<?php use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\RequestHandlerInterface; class SomeHandler implements RequestHandlerInterface { public function handle(ServerRequestInterface $request): ResponseInterface { /** @var ResponseInterface */ $response = ...; return $response; } }
然后您只需将处理器设置为中间件链的默认处理器。
<?php $defaultHandler = new SomeHandler(); $middleware = new MiddlewareChain($defaultHandler);
创建中间件
创建中间件组件有两种基本方法
- 预处理中间件
- 后处理中间件
预处理中间件
这种中间件风格拦截所有请求,并且有阻止其他中间件被调用的能力。它还可以在将请求传递给下一个处理器之前修改请求。安全层可能会使用这种风格的中间件,因为它可以确定用户是否有权执行某个操作,并在必要时停止请求继续。
<?php use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; class SomeMiddleware implements MiddlewareInterface { public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { if (/* able to process request */) { /** @var ResponseInterface */ $response = ...; return $response; } // You can modify the request before passing it along $newRequest = $request->withHeader('X-Validated', 'true'); // if unable to handle request, call the next middleware handler return $handler->handle($newRequest); } }
后处理中间件
或者,您可以使用后处理中间件,允许调用所有其他中间件,然后它可以在将响应返回给用户之前拦截响应。这种类型的中间件可能用于API,以确保在请求API资源时始终添加JSON内容类型。
<?php use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; class SomeMiddleware implements MiddlewareInterface { public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { /** @var ResponseInterface */ $response = $handler->handle($request); if (/* request meets criteria */) { return $response->withHeader('Content-type', 'application/json'); } return $response; } }