From 0f988a4c3bb4e0ad74e11223fabb92ede7c55b45 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mr=C2=B7x?= Date: Fri, 24 Sep 2021 18:14:38 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- http-handler/Abstracts/Handler.php | 23 +++++++++----------- http-handler/Abstracts/MiddlewareManager.php | 5 +++-- http-server/Service/Http.php | 5 ++++- 3 files changed, 17 insertions(+), 16 deletions(-) diff --git a/http-handler/Abstracts/Handler.php b/http-handler/Abstracts/Handler.php index 69ab46ab..d1f12bbf 100644 --- a/http-handler/Abstracts/Handler.php +++ b/http-handler/Abstracts/Handler.php @@ -12,23 +12,21 @@ use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; +use Swoole\Coroutine\Iterator; abstract class Handler implements RequestHandlerInterface { - private int $offset = 0; - - protected AspectProxy $aspectProxy; /** - * @param \Http\Handler\Handler $handler - * @param array|null $middlewares + * @param CHl $handler + * @param Iterator $middlewares */ - public function __construct(public CHl $handler, public ?array $middlewares) + public function __construct(public CHl $handler, public Iterator $middlewares) { $this->aspectProxy = Kiri::getDi()->get(AspectProxy::class); } @@ -41,16 +39,15 @@ abstract class Handler implements RequestHandlerInterface */ protected function execute(ServerRequestInterface $request): ResponseInterface { - if (empty($this->middlewares) || !isset($this->middlewares[$this->offset])) { + $middleware = $this->middlewares->current(); + if (empty($middleware)) { return $this->dispatcher($request); } + if (!($middleware instanceof MiddlewareInterface)) { + throw new \Exception('get_implements_class($middleware) not found method process.'); + } - $middleware = $this->middlewares[$this->offset]; - if (!($middleware instanceof MiddlewareInterface)) { - throw new \Exception('get_implements_class($middleware) not found method process.'); - } - - ++$this->offset; + $this->middlewares->next(); return $middleware->process($request, $this); } diff --git a/http-handler/Abstracts/MiddlewareManager.php b/http-handler/Abstracts/MiddlewareManager.php index 6601ef8a..0d0df477 100644 --- a/http-handler/Abstracts/MiddlewareManager.php +++ b/http-handler/Abstracts/MiddlewareManager.php @@ -38,11 +38,12 @@ class MiddlewareManager extends BaseObject if (is_string($middlewares)) { $middlewares = [$middlewares]; } + $source = &static::$_middlewares[$class][$method]; foreach ($middlewares as $middleware) { - if (isset(static::$_middlewares[$class][$method][$middleware])) { + if (isset($source[$middleware])) { continue; } - static::$_middlewares[$class][$method][$middleware] = di($middleware); + $source[$middleware] = di($middleware); } return true; } diff --git a/http-server/Service/Http.php b/http-server/Service/Http.php index b8c9a4e8..4f6256ea 100644 --- a/http-server/Service/Http.php +++ b/http-server/Service/Http.php @@ -16,6 +16,7 @@ use Http\Message\Stream; use Kiri\Abstracts\Config; use Kiri\Exception\ConfigException; use Kiri\Kiri; +use Kiri\Pool\Helper\SplQueue; use Psr\Http\Message\ServerRequestInterface; use Server\Abstracts\Utility\EventDispatchHelper; use Server\Abstracts\Utility\ResponseHelper; @@ -28,6 +29,7 @@ use Server\ExceptionHandlerInterface; use Server\SInterface\OnCloseInterface; use Server\SInterface\OnConnectInterface; use Server\SInterface\OnRequestInterface; +use Swoole\Coroutine\Iterator; use Swoole\Http\Request; use Swoole\Http\Response; use Swoole\Server; @@ -113,7 +115,8 @@ class Http implements OnCloseInterface, OnConnectInterface, OnRequestInterface { $middlewares = MiddlewareManager::get($handler->callback); - $dispatcher = new Dispatcher($handler, $middlewares); + + $dispatcher = new Dispatcher($handler, new Iterator($middlewares)); return $dispatcher->handle($PsrRequest); }