diff --git a/src/Server/Http/Middleware/ActionWrapMiddleware.php b/src/Server/Http/Middleware/ActionWrapMiddleware.php index 202cefd15..b04ba4e78 100644 --- a/src/Server/Http/Middleware/ActionWrapMiddleware.php +++ b/src/Server/Http/Middleware/ActionWrapMiddleware.php @@ -11,43 +11,69 @@ use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; +use Imi\Server\Http\Middleware\ActionMiddleware; +use Imi\Server\Http\Middleware\RouteMiddleware; +use Imi\Server\Annotation\ServerInject; /** * @Bean("ActionWrapMiddleware") */ class ActionWrapMiddleware implements MiddlewareInterface { + + /** + * @ServerInject("RouteMiddleware") + */ + protected RouteMiddleware $routeMiddleware; + /** - * 动作中间件. + * @ServerInject("ActionMiddleware") */ - protected string $actionMiddleware = ActionMiddleware::class; + protected ActionMiddleware $actionMiddleware; /** * {@inheritDoc} */ public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface { + // 获取路由结果 /** @var \Imi\Server\Http\Route\RouteResult|null $result */ $result = RequestContext::get('routeResult'); - if (null === $result) - { - return $handler->handle($request); + if ($result) { + $middlewares = $result->routeItem->middlewares; + if ($middlewares) { + $middlewares[] = ActionMiddleware::class; + $subHandler = new RequestHandler($middlewares); + $response = $subHandler->handle($request); + if ($response) { + return $response; + } + } } - $middlewares = $result->routeItem->middlewares; - if ($middlewares) - { - $middlewares[] = $this->actionMiddleware; - $subHandler = new RequestHandler($middlewares); - return $subHandler->handle($request); + $context = RequestContext::getContext(); + /** @var \Imi\Server\Http\Message\Response $response */ + $response = $context['response'] ?? null; + if (!$response) { + throw new \RuntimeException('ResponseContent not found '); } - else - { - /** @var \Psr\Http\Server\MiddlewareInterface $requestHandler */ - $requestHandler = RequestContext::getServerBean($this->actionMiddleware); - return $requestHandler->process($request, $handler); + $result = $this->routeMiddleware->dispatch($request, $response); + if ($result) { + /** @var Response $response */ + $response = $result; + } elseif ($result = $this->actionMiddleware->dispatch($request, $response)) { + /** @var Response $response */ + $response = $result; + } else { + /** @var \Psr\Http\Server\MiddlewareInterface $requestHandler */ + $requestHandler = RequestContext::getServerBean('ActionMiddleware'); + if (!$requestHandler) { + throw new \RuntimeException('RequestContent not found ActionMiddleware'); + } + $response = $requestHandler->process($request, $handler); } + return $response; } }