From ea91601459f743d7ae2f779328febf63349a74ec Mon Sep 17 00:00:00 2001 From: Matias Griese Date: Mon, 11 Feb 2019 15:01:23 +0200 Subject: [PATCH] Allow onRequestHandlerInit to set Response object --- .../Processors/Events/RequestHandlerEvent.php | 21 +++++++ .../Common/Processors/RequestProcessor.php | 8 ++- .../RequestHandler/RequestHandler.php | 48 ++------------- .../Traits/RequestHandlerTrait.php | 59 +++++++++++++++++++ 4 files changed, 92 insertions(+), 44 deletions(-) create mode 100644 system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php diff --git a/system/src/Grav/Common/Processors/Events/RequestHandlerEvent.php b/system/src/Grav/Common/Processors/Events/RequestHandlerEvent.php index 5a81d1a96..fd97e9e45 100644 --- a/system/src/Grav/Common/Processors/Events/RequestHandlerEvent.php +++ b/system/src/Grav/Common/Processors/Events/RequestHandlerEvent.php @@ -11,6 +11,7 @@ namespace Grav\Common\Processors\Events; use Grav\Framework\RequestHandler\RequestHandler; use Grav\Framework\Route\Route; +use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use RocketTheme\Toolbox\Event\Event; @@ -41,6 +42,26 @@ class RequestHandlerEvent extends Event return $this->offsetGet('handler'); } + /** + * @return ResponseInterface|null + */ + public function getResponse(): ?ResponseInterface + { + return $this->offsetGet('response'); + } + + /** + * @param ResponseInterface $response + * @return $this + */ + public function setResponse(ResponseInterface $response): self + { + $this->offsetSet('response', $response); + $this->stopPropagation(); + + return $this; + } + /** * @param string $name * @param MiddlewareInterface $middleware diff --git a/system/src/Grav/Common/Processors/RequestProcessor.php b/system/src/Grav/Common/Processors/RequestProcessor.php index d92dd7ee4..2f2165450 100644 --- a/system/src/Grav/Common/Processors/RequestProcessor.php +++ b/system/src/Grav/Common/Processors/RequestProcessor.php @@ -29,9 +29,15 @@ class RequestProcessor extends ProcessorBase ->withAttribute('referrer', $this->container['uri']->referrer()); $event = new RequestHandlerEvent(['request' => $request, 'handler' => $handler]); - $this->container->fireEvent('onRequestHandlerInit', $event); + /** @var RequestHandlerEvent $event */ + $event = $this->container->fireEvent('onRequestHandlerInit', $event); + $response = $event->getResponse(); $this->stopTimer(); + if ($response) { + return $response; + } + return $handler->handle($request); } } diff --git a/system/src/Grav/Framework/RequestHandler/RequestHandler.php b/system/src/Grav/Framework/RequestHandler/RequestHandler.php index 42f62231a..ef1f83805 100644 --- a/system/src/Grav/Framework/RequestHandler/RequestHandler.php +++ b/system/src/Grav/Framework/RequestHandler/RequestHandler.php @@ -11,23 +11,14 @@ declare(strict_types=1); namespace Grav\Framework\RequestHandler; -use Grav\Framework\RequestHandler\Exception\InvalidArgumentException; +use Grav\Framework\RequestHandler\Traits\RequestHandlerTrait; use Psr\Container\ContainerInterface; -use Psr\Http\Message\ResponseInterface; -use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Server\MiddlewareInterface; use Psr\Http\Server\RequestHandlerInterface; class RequestHandler implements RequestHandlerInterface { - /** @var string[]|MiddlewareInterface[]|array */ - protected $middleware; - - /** @var callable */ - private $default; - - /** @var ContainerInterface */ - private $container; + use RequestHandlerTrait; /** * Delegate constructor. @@ -39,7 +30,7 @@ class RequestHandler implements RequestHandlerInterface public function __construct(array $middleware, callable $default, ContainerInterface $container = null) { $this->middleware = $middleware; - $this->default = $default; + $this->handler = $default; $this->container = $container; } @@ -50,7 +41,7 @@ class RequestHandler implements RequestHandlerInterface * @param callable $callable * @return $this */ - public function addCallable($name, callable $callable) + public function addCallable($name, callable $callable): self { $this->container[$name] = $callable; array_unshift($this->middleware, $name); @@ -65,40 +56,11 @@ class RequestHandler implements RequestHandlerInterface * @param callable $callable * @return $this */ - public function addMiddleware($name, MiddlewareInterface $middleware) + public function addMiddleware($name, MiddlewareInterface $middleware): self { $this->container[$name] = $middleware; array_unshift($this->middleware, $name); return $this; } - - /** - * {@inheritdoc} - * @throws InvalidArgumentException - */ - public function handle(ServerRequestInterface $request): ResponseInterface - { - $middleware = array_shift($this->middleware); - - // Use default callable if there is no middleware. - if ($middleware === null) { - return \call_user_func($this->default, $request); - } - - if ($middleware instanceof MiddlewareInterface) { - return $middleware->process($request, clone $this); - } - - if (!$this->container || !$this->container->has($middleware)) { - throw new InvalidArgumentException( - sprintf('The middleware is not a valid %s and is not passed in the Container', MiddlewareInterface::class), - $middleware - ); - } - - array_unshift($this->middleware, $this->container->get($middleware)); - - return $this->handle($request); - } } \ No newline at end of file diff --git a/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php b/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php new file mode 100644 index 000000000..2de870fc8 --- /dev/null +++ b/system/src/Grav/Framework/RequestHandler/Traits/RequestHandlerTrait.php @@ -0,0 +1,59 @@ +middleware); + + // Use default callable if there is no middleware. + if ($middleware === null) { + return \call_user_func($this->handler, $request); + } + + if ($middleware instanceof MiddlewareInterface) { + return $middleware->process($request, clone $this); + } + + if (!$this->container || !$this->container->has($middleware)) { + throw new InvalidArgumentException( + sprintf('The middleware is not a valid %s and is not passed in the Container', MiddlewareInterface::class), + $middleware + ); + } + + array_unshift($this->middleware, $this->container->get($middleware)); + + return $this->handle($request); + } +} \ No newline at end of file