Allow onRequestHandlerInit to set Response object

This commit is contained in:
Matias Griese
2019-02-11 15:01:23 +02:00
parent 6e3edb7dfb
commit ea91601459
4 changed files with 92 additions and 44 deletions

View File

@@ -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

View File

@@ -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);
}
}

View File

@@ -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);
}
}

View File

@@ -0,0 +1,59 @@
<?php
/**
* @package Grav\Framework\RequestHandler
*
* @copyright Copyright (C) 2015 - 2019 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
declare(strict_types=1);
namespace Grav\Framework\RequestHandler\Traits;
use Grav\Framework\RequestHandler\Exception\InvalidArgumentException;
use Psr\Container\ContainerInterface;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
trait RequestHandlerTrait
{
/** @var string[]|MiddlewareInterface[]|array */
protected $middleware;
/** @var callable */
private $handler;
/** @var ContainerInterface */
private $container;
/**
* {@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->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);
}
}