mirror of
https://github.com/getgrav/grav.git
synced 2026-07-20 00:31:02 +02:00
Allow onRequestHandlerInit to set Response object
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user