中间件 (Middleware)
中间件(Middleware)
的基本功能是提供一种过滤机制,用来改造和筛选 HTTP 请求,一种常见的场景是对用户进行身份验证,如果验证不通过,会将用户引导至登录页面。另一种场景是为所有待返回的 Response
添加 CORS
头信息,以允许跨域请求,如 tuupola/cors-middleware
.
中间件是一个层次模型,你可以将它看做一系列的层级,请求将从外向内通过每一层中间件,最终抵达 Handler
. 在处理过程中,每一层都有权通过请求或拒绝请求,返回应答。当其中一层返回 Response
对象后,处理链条也随之终止。
*-------------------------*
| Middleware |
| *-----------------* |
| | Middleware | |
| | *---------* | | *---------*
| | | |<--|<--|<--| Request |
| | | Request | | | *---------*
| | | Handler | | | *----------*
| | | |-->|-->|-->| Response |
| | *---------* | | *----------*
| *-----------------* |
*-------------------------*
Fluff 的的中间件遵循 PSR-15
标准,所以必须实现 Psr\Http\Server\MiddlewareInterface
.
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
class SayHelloMiddleware implements MiddlewareInterface
{
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
// 前置操作
$response = $handler->handle($request);
// 后置操作
return $response;
}
}
通过 \Psr\Http\Server\RequestHandlerInterface::handler
方法,将处理后的 Request
对象传入下一层中间件或 Handler
中,这样,应用程序的每一层都只关注自己需要处理的业务,增强了程序的可用性。返回的 Response
将有一个回溯的过程,让之前的每一个中间件也有机会对它做出调整。
中间件不仅过滤请求,也是扩展功能的重要手段,接下来的章节将展示,由不同种类的中间件和 Request Handle 搭配衍生出的几种架构风格
。