diff --git a/src/Annotate/Middleware.php b/src/Annotate/Middleware.php index b7a3841..083cf8a 100644 --- a/src/Annotate/Middleware.php +++ b/src/Annotate/Middleware.php @@ -25,7 +25,7 @@ class Middleware implements InjectMethodInterface */ public function dispatch(string $class, string $method): void { - MiddlewareManager::set($class, $method, $this->middleware); +// MiddlewareManager::set($class, $method, $this->middleware); } diff --git a/src/Handler.php b/src/Handler.php index cb42409..ed1d773 100644 --- a/src/Handler.php +++ b/src/Handler.php @@ -27,6 +27,11 @@ class Handler implements RequestHandlerInterface protected array $methods = []; + /** + * @var array + */ + protected array $middlewares = []; + /** * @param array|Closure $handler * @param array $parameters @@ -100,6 +105,24 @@ class Handler implements RequestHandlerInterface return $this->handler[1]; } + /** + * @param array $middlewares + * @return void + */ + public function setMiddlewares(array $middlewares): void + { + $this->middlewares = $middlewares; + } + + + /** + * @return array + */ + public function getMiddlewares(): array + { + return $this->middlewares; + } + /** * @param ServerRequestInterface $request diff --git a/src/Router.php b/src/Router.php index c9738b2..da4a2b5 100644 --- a/src/Router.php +++ b/src/Router.php @@ -209,7 +209,7 @@ class Router { $router = $container->get(DataGrip::class)->get(static::$type); foreach ($router->getMethods() as $name => $method) { - $middlewares = MiddlewareManager::get($method->getClass(), $method->getMethod()); + $middlewares = $method->getMiddlewares(); $validator = MiddlewareManager::getValidator($method->getClass(), $method->getMethod()); if (!is_null($validator)) { array_unshift($middlewares, new ValidatorMiddleware(di(ResponseInterface::class), $method->getClass(), $method->getMethod())); diff --git a/src/RouterCollector.php b/src/RouterCollector.php index baa4432..b7831e9 100644 --- a/src/RouterCollector.php +++ b/src/RouterCollector.php @@ -8,6 +8,7 @@ namespace Kiri\Router; use Closure; use Kiri\Router\Base\NotFoundController; use Kiri\Router\Constrict\RequestMethod; +use ReflectionException; use Throwable; use Traversable; use Kiri\Router\Base\Middleware; @@ -204,47 +205,60 @@ class RouterCollector implements \ArrayAccess, \IteratorAggregate public function register(string $path, string $method, Handler $handler): void { $this->methods[$method . '_' . $path] = $handler; - $this->registerMiddleware($handler->getClass(), $handler->getMethod()); + $middlewares = $this->registerMiddleware($handler->getClass(), $handler->getMethod()); + if (count($middlewares) > 0) { + $handler->setMiddlewares($middlewares); + } } /** * @param string $class * @param string $method - * @return void - * @throws + * @return array + * @throws ReflectionException */ - public function registerMiddleware(string $class, string $method): void + public function registerMiddleware(string $class, string $method): array { + $response = []; $middlewares = \request()->middlewares; - var_dump($class . '::' . $method . '('.json_encode($middlewares,JSON_UNESCAPED_UNICODE).')'); if (count($middlewares) > 0) { - $this->appendMiddleware($middlewares, $class, $method); + $response = $this->appendMiddleware($response, $middlewares); } $middlewares = array_column($this->groupTack, 'middleware'); - if (count($middlewares) > 0) { - $this->appendMiddleware($middlewares, $class, $method); + $response = $this->appendMiddleware($response, $middlewares); + + $reflect = \Kiri::getDi()->getReflectionClass($class); + $attributes = $reflect->getMethod($method)->getAttributes(Annotate\Middleware::class); + + foreach ($attributes as $attribute) { + if (!in_array($attribute->getName(), $response)) { + $response[] = $attribute->getName(); + } } + + return $response; } /** + * @param array $response * @param array $middlewares - * @param $class - * @param $method - * @return void - * @throws + * @return array */ - private function appendMiddleware(array $middlewares, $class, $method): void + private function appendMiddleware(array $response, array $middlewares): array { foreach ($middlewares as $middleware) { if (is_string($middleware)) { $middleware = [$middleware]; } foreach ($middleware as $value) { - Middleware::set($class, $method, $value); + if (!in_array($value, $response)) { + $response[] = $value; + } } } + return $response; } /**