中间件 Middleware

    只需要实现了 接口均为一个合法的中间件,其中 process() 方法为该中间件逻辑处理方法, 可以参考 Swoft 项目呢 app/Middlewares/ 目录下的文件, 比如 app/Middlewares/ActionTestMiddleware:

    使用

    1. // 全局中间件配置: app/config/beans/base.php
    2. return [
    3. ...
    4. 'serverDispatcher' => [
    5. 'middlewares' => [
    6. \Swoft\View\Middleware\ViewMiddleware::class,
    7. \Swoft\Session\Middleware\SessionMiddleware::class,
    8. ]
    9. ],
    10. ...
    11. ];

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

    • 当将此注解应用于 Controller 上,则作用域为整个 Controller
    • 将此注解应用于 Action 上,则作用域仅为当前的 Action
    • @Middleware 用于配置单个中间件
    • @Middlewares 显而易见的是用于配置一组 ,按照定义顺序依次执行, 使用参考 app/Controllers/MiddlewareController.php

    构造一个新的 Response 对象直接返回

    1. public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    2. $auth = false;
    3. // 如果验证不通过
    4. if (!$auth) {
    5. // response() 函数可以快速从 RequestContext 获得 Response 对象
    6. return response()->withStatus(401);
    7. }
    8. // 委托给下一个中间件处理
    9. $response = $handler->handle($request);
    10. return $response;
    11. }

    抛出异常返回

    只要在请求生命周期内抛出的异常会被 ErrorHandler 捕获并处理,中间件内抛出也是如此,这部分不属于中间件的内容,顾在此不多做阐述。

    1. <?php
    2. namespace App\Middlewares;
    3. use Psr\Http\Server\RequestHandlerInterface;
    4. use Psr\Http\Message\ResponseInterface;
    5. use Psr\Http\Message\ServerRequestInterface;
    6. use Swoft\Bean\Annotation\Bean;
    7. use Swoft\Http\Message\Middleware\MiddlewareInterface;
    8. /**
    9. * @Bean()
    10. */
    11. {
    12. * Process an incoming server request and return a response, optionally delegating
    13. * response creation to a handler.
    14. *
    15. * @param \Psr\Http\Message\ServerRequestInterface $request
    16. * @param \Psr\Http\Server\RequestHandlerInterface $handler
    17. * @return \Psr\Http\Message\ResponseInterface
    18. * @throws \InvalidArgumentException
    19. */
    20. public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
    21. {
    22. if ('OPTIONS' === $request->getMethod()) {
    23. return $this->configResponse(\response());
    24. }
    25. $response = $handler->handle($request);
    26. return $this->configResponse($response);
    27. }
    28. private function configResponse(ResponseInterface $response)
    29. {
    30. return $response
    31. ->withHeader('Access-Control-Allow-Origin', 'http://mysite')
    32. ->withHeader('Access-Control-Allow-Headers', 'X-Requested-With, Content-Type, Accept, Origin, Authorization')
    33. ->withHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS');