只需要实现了 Swoft\Http\Server\Contract\MiddlewareInterface 接口均为一个合法的中间件,其中 process() 方法为该中间件逻辑处理方法。

配置全局中间件

  1. ...
  2. 'httpDispatcher'=>[
  3. 'middlewares'=>[
  4. AuthMiddleware::class,
  5. ApiMiddleware::class
  6. ]
  7. ]
  8. ...
  9. ]

通过 @Middleware@Middlewares, 可以很方便的配置中间件到当前的 Controller 和 Action 内

提前拦截请求

  1. namespace App\Http\Middleware;
  2. use Psr\Http\Message\ResponseInterface;
  3. use Psr\Http\Message\ServerRequestInterface;
  4. use Psr\Http\Server\RequestHandlerInterface;
  5. use Swoft\Bean\Annotation\Mapping\Bean;
  6. use Swoft\Context\Context;
  7. use Swoft\Http\Server\Contract\MiddlewareInterface;
  8. /**
  9. * @Bean()
  10. */
  11. class SomeMiddleware implements MiddlewareInterface
  12. /**
  13. * Process an incoming server request.
  14. * @param ServerRequestInterface $request
  15. * @param RequestHandlerInterface $handler
  16. * @return ResponseInterface
  17. * @inheritdoc
  18. */
  19. public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
  20. {
  21. $path = $request->getUri()->getPath();
  22. if ($path === '/favicon.ico') {
  23. $response = Context::mustGet()->getResponse();
  24. return $response->withStatus(404);
  25. }
  26. return $handler->handle($request);
  27. }
  28. }

用户JWT登陆验证

  1. namespace App\Http\Middleware;
  2. use Psr\Http\Message\ResponseInterface;
  3. use Psr\Http\Message\ServerRequestInterface;
  4. use Psr\Http\Server\RequestHandlerInterface;
  5. use Swoft\Bean\Annotation\Mapping\Bean;
  6. use Swoft\Context\Context;
  7. use Swoft\Http\Server\Contract\MiddlewareInterface;
  8. /**
  9. * @Bean()
  10. {
  11. /**
  12. * Process an incoming server request.
  13. * @param ServerRequestInterface $request
  14. * @param RequestHandlerInterface $handler
  15. * @return ResponseInterface
  16. * @inheritdoc
  17. */
  18. public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
  19. {
  20. // before request handle
  21. // 判断token
  22. $token = $request->getHeaderLine("token");
  23. $type = \config('jwt.type');
  24. $public = \config('jwt.publicKey');
  25. try {
  26. $auth = JWT::decode($token, $public, ['type' => $type]);
  27. $request->user = $auth->user;
  28. } catch (\Exception $e) {
  29. $json = ['code'=>0,'msg'=>'授权失败']
  30. $response = Context::mustGet()->getResponse();
  31. return $response->withData($json);
  32. }
  33. $response = $handler->handle($request);
  34. return $response;
  35. // after request handle
  36. }