Added request processor

This commit is contained in:
Matias Griese
2018-10-22 10:46:37 +03:00
parent f9cc86a6db
commit fc0dfbe8b4
5 changed files with 113 additions and 9 deletions

View File

@@ -23,6 +23,7 @@ use Grav\Common\Processors\LoggerProcessor;
use Grav\Common\Processors\PagesProcessor;
use Grav\Common\Processors\PluginsProcessor;
use Grav\Common\Processors\RenderProcessor;
use Grav\Common\Processors\RequestProcessor;
use Grav\Common\Processors\SchedulerProcessor;
use Grav\Common\Processors\SiteSetupProcessor;
use Grav\Common\Processors\TasksProcessor;
@@ -92,9 +93,10 @@ class Grav extends Container
'initializeProcessor',
'pluginsProcessor',
'themesProcessor',
'requestProcessor',
'tasksProcessor',
'backupsProcessor',
'schedulerProcessor',
'tasksProcessor',
'assetsProcessor',
'twigProcessor',
'pagesProcessor',
@@ -170,6 +172,9 @@ class Grav extends Container
'schedulerProcessor' => function () {
return new SchedulerProcessor($this);
},
'requestProcessor' => function () {
return new RequestProcessor($this);
},
'tasksProcessor' => function () {
return new TasksProcessor($this);
},

View File

@@ -0,0 +1,24 @@
<?php
/**
* @package Grav.Common.Processors
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Processors\Events;
use Grav\Framework\RequestHandler\RequestHandler;
use Psr\Http\Server\MiddlewareInterface;
use RocketTheme\Toolbox\Event\Event;
class RequestHandlerInitEvent extends Event
{
public function addMiddleware($name, MiddlewareInterface $middleware)
{
/** @var RequestHandler $handler */
$handler = $this['handler'];
$handler->addMiddleware($name, $middleware);
}
}

View File

@@ -0,0 +1,37 @@
<?php
/**
* @package Grav.Common.Processors
*
* @copyright Copyright (C) 2015 - 2018 Trilby Media, LLC. All rights reserved.
* @license MIT License; see LICENSE file for details.
*/
namespace Grav\Common\Processors;
use Grav\Common\Uri;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface;
use RocketTheme\Toolbox\Event\Event;
class RequestProcessor extends ProcessorBase
{
public $id = 'request';
public $title = 'Request';
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler) : ResponseInterface
{
$this->startTimer();
$request = $request
->withAttribute('grav', $this->container)
->withAttribute('route', Uri::getCurrentRoute())
->withAttribute('referrer', $this->container['uri']->referrer());
$event = new Event(['handler' => $handler]);
$this->container->fireEvent('onRequestHandlerInit', $event);
$this->stopTimer();
return $handler->handle($request);
}
}

View File

@@ -0,0 +1,34 @@
<?php
declare(strict_types=1);
namespace Grav\Framework\RequestHandler\Middlewares;
use Grav\Framework\Psr7\Response;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;
class Exceptions implements MiddlewareInterface
{
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler) : ResponseInterface
{
try {
return $handler->handle($request);
} catch (\Throwable $exception) {
$response = [
'error' => [
'type' => \get_class($exception),
'code' => $exception->getCode(),
'message' => $exception->getMessage(),
'file' => $exception->getFile(),
'line' => $exception->getLine(),
'trace' => explode("\n", $exception->getTraceAsString()),
]
];
return new Response($exception->getCode() ?: 500, [], json_encode($response));
}
}
}

View File

@@ -22,9 +22,6 @@ class RequestHandler implements RequestHandlerInterface
/** @var ContainerInterface */
private $container;
/** @var callable */
private $wrapper;
/**
* Delegate constructor.
*
@@ -40,24 +37,31 @@ class RequestHandler implements RequestHandlerInterface
}
/**
* @param callable $wrapper
* Add callable initializing Middleware that will be executed as soon as possible.
*
* @param $name
* @param callable $callable
* @return $this
*/
public function setWrapper(callable $wrapper)
public function addCallable($name, callable $callable)
{
$this->wrapper = $wrapper;
$this->container[$name] = $callable;
array_unshift($this->middleware, $name);
return $this;
}
/**
* Add Middleware that will be executed as soon as possible.
*
* @param $name
* @param callable $callable
* @return $this
*/
public function add($name, callable $callable)
public function addMiddleware($name, MiddlewareInterface $middleware)
{
$this->container[$name] = $callable;
$this->container[$name] = $middleware;
array_unshift($this->middleware, $name);
return $this;
}