今天碰到一个问题 , 就是正常跑接口 , 我们需要做一些日志 , 当出现慢日志问题进行分析与接口优化 , 于是想到了全局中间件
但是hyperf文档中没有写

根据这个官方的图示 , 可以看到这是一个洋葱模型 , 也就是说 , 肯定存在后置中间件
执行顺序: Request -> Middleware 1 -> Middleware 2 -> Middleware 3 -> Middleware 2 -> Middleware 1 -> Response
-
- declare(strict_types=1);
-
- namespace App\Middleware\Auth;
-
- use Hyperf\HttpServer\Contract\RequestInterface;
- use Hyperf\HttpServer\Contract\ResponseInterface as HttpResponse;
- use Psr\Container\ContainerInterface;
- use Psr\Http\Message\ResponseInterface;
- use Psr\Http\Message\ServerRequestInterface;
- use Psr\Http\Server\MiddlewareInterface;
- use Psr\Http\Server\RequestHandlerInterface;
-
- class FooMiddleware implements MiddlewareInterface
- {
- protected ContainerInterface $container;
-
- protected RequestInterface $request;
-
- protected HttpResponse $response;
-
- public function __construct(ContainerInterface $container, HttpResponse $response, RequestInterface $request)
- {
- $this->container = $container;
- $this->response = $response;
- $this->request = $request;
- }
-
- public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
- {
- // 根据具体业务判断逻辑走向,这里假设用户携带的token有效
- $isValidToken = true;
- if ($isValidToken) {
- return $handler->handle($request);
- }
-
- return $this->response->json(
- [
- 'code' => -1,
- 'data' => [
- 'error' => '中间件验证token无效,阻止继续向下执行',
- ],
- ]
- );
- }
- }
那么 ,后置中间件怎么写呢?
忙了一会后,成功了
-
- declare(strict_types=1);
-
- namespace App\Middleware\Auth;
-
- use Hyperf\HttpServer\Contract\RequestInterface;
- use Hyperf\HttpServer\Contract\ResponseInterface as HttpResponse;
- use Psr\Container\ContainerInterface;
- use Psr\Http\Message\ResponseInterface;
- use Psr\Http\Message\ServerRequestInterface;
- use Psr\Http\Server\MiddlewareInterface;
- use Psr\Http\Server\RequestHandlerInterface;
-
- class FooMiddleware implements MiddlewareInterface
- {
- protected ContainerInterface $container;
-
- protected RequestInterface $request;
-
- protected HttpResponse $response;
-
- public function __construct(ContainerInterface $container, HttpResponse $response, RequestInterface $request)
- {
- $this->container = $container;
- $this->response = $response;
- $this->request = $request;
- }
-
- public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
- {
- // TODO 前置中间件逻辑
-
- $response = $handler->handle($request);
- // TODO 后置中间件逻辑
-
-
- return $response;
- }
- }
-
- declare(strict_types=1);
-
- namespace App\Middleware;
-
-
- use Hyperf\Di\Annotation\Inject;
- use Hyperf\HttpServer\Contract\RequestInterface;
- use Psr\Container\ContainerInterface;
- use Psr\Http\Message\ResponseInterface;
- use Psr\Http\Message\ServerRequestInterface;
- use Psr\Http\Server\MiddlewareInterface;
- use Psr\Http\Server\RequestHandlerInterface;
-
- class RunMiddleware implements MiddlewareInterface
- {
-
- /**
- * @var RequestInterface
- */
- #[Inject]
- protected $httpRequest;
-
- public function __construct(protected ContainerInterface $container)
- {
-
- }
-
- public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
- {
- $starttime = microtime(true);
- echo "请求路由:" . PHP_EOL;
- var_dump($this->httpRequest->getRequestUri());
- echo "请求参数:" . PHP_EOL;
- var_dump($this->httpRequest->all());
- echo "开始时间:" . $starttime . PHP_EOL;
-
- # 请求结果
- $response = $handler->handle($request);
- $endtime = microtime(true);
- echo "结束时间:" . $endtime . PHP_EOL;
- echo "执行时间:" . ($endtime - $starttime) . PHP_EOL;
- echo "________________________________________________________________________________________________". PHP_EOL;
-
- return $response;
- }
- }