• hyperf 前置中间件 后置中间件


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

    但是hyperf文档中没有写

    Hyperf

     

     根据这个官方的图示 , 可以看到这是一个洋葱模型 , 也就是说 , 肯定存在后置中间件

    执行顺序: Request -> Middleware 1 -> Middleware 2 -> Middleware 3 -> Middleware 2 -> Middleware 1 -> Response

    官方demo:

    1. declare(strict_types=1);
    2. namespace App\Middleware\Auth;
    3. use Hyperf\HttpServer\Contract\RequestInterface;
    4. use Hyperf\HttpServer\Contract\ResponseInterface as HttpResponse;
    5. use Psr\Container\ContainerInterface;
    6. use Psr\Http\Message\ResponseInterface;
    7. use Psr\Http\Message\ServerRequestInterface;
    8. use Psr\Http\Server\MiddlewareInterface;
    9. use Psr\Http\Server\RequestHandlerInterface;
    10. class FooMiddleware implements MiddlewareInterface
    11. {
    12. protected ContainerInterface $container;
    13. protected RequestInterface $request;
    14. protected HttpResponse $response;
    15. public function __construct(ContainerInterface $container, HttpResponse $response, RequestInterface $request)
    16. {
    17. $this->container = $container;
    18. $this->response = $response;
    19. $this->request = $request;
    20. }
    21. public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    22. {
    23. // 根据具体业务判断逻辑走向,这里假设用户携带的token有效
    24. $isValidToken = true;
    25. if ($isValidToken) {
    26. return $handler->handle($request);
    27. }
    28. return $this->response->json(
    29. [
    30. 'code' => -1,
    31. 'data' => [
    32. 'error' => '中间件验证token无效,阻止继续向下执行',
    33. ],
    34. ]
    35. );
    36. }
    37. }

     那么 ,后置中间件怎么写呢? 

    忙了一会后,成功了

    后置中间件

    1. declare(strict_types=1);
    2. namespace App\Middleware\Auth;
    3. use Hyperf\HttpServer\Contract\RequestInterface;
    4. use Hyperf\HttpServer\Contract\ResponseInterface as HttpResponse;
    5. use Psr\Container\ContainerInterface;
    6. use Psr\Http\Message\ResponseInterface;
    7. use Psr\Http\Message\ServerRequestInterface;
    8. use Psr\Http\Server\MiddlewareInterface;
    9. use Psr\Http\Server\RequestHandlerInterface;
    10. class FooMiddleware implements MiddlewareInterface
    11. {
    12. protected ContainerInterface $container;
    13. protected RequestInterface $request;
    14. protected HttpResponse $response;
    15. public function __construct(ContainerInterface $container, HttpResponse $response, RequestInterface $request)
    16. {
    17. $this->container = $container;
    18. $this->response = $response;
    19. $this->request = $request;
    20. }
    21. public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    22. {
    23. // TODO 前置中间件逻辑
    24. $response = $handler->handle($request);
    25. // TODO 后置中间件逻辑
    26. return $response;
    27. }
    28. }

     我的demo:

    1. declare(strict_types=1);
    2. namespace App\Middleware;
    3. use Hyperf\Di\Annotation\Inject;
    4. use Hyperf\HttpServer\Contract\RequestInterface;
    5. use Psr\Container\ContainerInterface;
    6. use Psr\Http\Message\ResponseInterface;
    7. use Psr\Http\Message\ServerRequestInterface;
    8. use Psr\Http\Server\MiddlewareInterface;
    9. use Psr\Http\Server\RequestHandlerInterface;
    10. class RunMiddleware implements MiddlewareInterface
    11. {
    12. /**
    13. * @var RequestInterface
    14. */
    15. #[Inject]
    16. protected $httpRequest;
    17. public function __construct(protected ContainerInterface $container)
    18. {
    19. }
    20. public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    21. {
    22. $starttime = microtime(true);
    23. echo "请求路由:" . PHP_EOL;
    24. var_dump($this->httpRequest->getRequestUri());
    25. echo "请求参数:" . PHP_EOL;
    26. var_dump($this->httpRequest->all());
    27. echo "开始时间:" . $starttime . PHP_EOL;
    28. # 请求结果
    29. $response = $handler->handle($request);
    30. $endtime = microtime(true);
    31. echo "结束时间:" . $endtime . PHP_EOL;
    32. echo "执行时间:" . ($endtime - $starttime) . PHP_EOL;
    33. echo "________________________________________________________________________________________________". PHP_EOL;
    34. return $response;
    35. }
    36. }
  • 相关阅读:
    百度网盘svip白嫖永久手机2024最新教程
    一键PDF转Word,PP-Structurev2文档分析模型深度解读!
    【动态规划】leetcode 509. 斐波那契数
    Java函数式编程:三、流与函数式编程
    一个简单HTML5期末考核大作业,学生个人html静态网页制作代码
    vulnhub靶场之ICA: 1
    多态原理、虚表指针与虚基表的内存布局。
    软件项目管理 7.4.3.进度计划编排-时间压缩法
    Keras:ModelCheckpoint和model.fit的verbose有什么差异?
    基于ATX的自动化测试管理软件:Q-Automation
  • 原文地址:https://blog.csdn.net/s1095622320/article/details/126893951