diff --git a/system/src/Grav/Common/Grav.php b/system/src/Grav/Common/Grav.php index 2bd40d316..1cf93256d 100644 --- a/system/src/Grav/Common/Grav.php +++ b/system/src/Grav/Common/Grav.php @@ -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); }, diff --git a/system/src/Grav/Common/Processors/Events/RequestHandlerInitEvent.php b/system/src/Grav/Common/Processors/Events/RequestHandlerInitEvent.php new file mode 100644 index 000000000..5fcd849af --- /dev/null +++ b/system/src/Grav/Common/Processors/Events/RequestHandlerInitEvent.php @@ -0,0 +1,24 @@ +addMiddleware($name, $middleware); + } +} diff --git a/system/src/Grav/Common/Processors/RequestProcessor.php b/system/src/Grav/Common/Processors/RequestProcessor.php new file mode 100644 index 000000000..25f67d5c9 --- /dev/null +++ b/system/src/Grav/Common/Processors/RequestProcessor.php @@ -0,0 +1,37 @@ +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); + } +} diff --git a/system/src/Grav/Framework/RequestHandler/Middlewares/Exceptions.php b/system/src/Grav/Framework/RequestHandler/Middlewares/Exceptions.php new file mode 100644 index 000000000..ae117db90 --- /dev/null +++ b/system/src/Grav/Framework/RequestHandler/Middlewares/Exceptions.php @@ -0,0 +1,34 @@ +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)); + } + } +} diff --git a/system/src/Grav/Framework/RequestHandler/RequestHandler.php b/system/src/Grav/Framework/RequestHandler/RequestHandler.php index a87267039..e873e4fc4 100644 --- a/system/src/Grav/Framework/RequestHandler/RequestHandler.php +++ b/system/src/Grav/Framework/RequestHandler/RequestHandler.php @@ -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; }