From ef3552f0d650952ce9757d27d5aa8b8b07b10c7d Mon Sep 17 00:00:00 2001 From: Geert Eltink Date: Fri, 11 Nov 2016 15:19:14 +0100 Subject: [PATCH 1/2] Add the new error handler classes --- src/Container/ErrorHandlerFactory.php | 24 +++++++ src/Container/NotFoundHandlerFactory.php | 24 +++++++ ...TemplatedErrorResponseGeneratorFactory.php | 26 +++++++ src/NotFoundHandler.php | 69 +++++++++++++++++++ src/TemplatedErrorResponseGenerator.php | 38 ++++++++++ 5 files changed, 181 insertions(+) create mode 100644 src/Container/ErrorHandlerFactory.php create mode 100644 src/Container/NotFoundHandlerFactory.php create mode 100644 src/Container/TemplatedErrorResponseGeneratorFactory.php create mode 100644 src/NotFoundHandler.php create mode 100644 src/TemplatedErrorResponseGenerator.php diff --git a/src/Container/ErrorHandlerFactory.php b/src/Container/ErrorHandlerFactory.php new file mode 100644 index 00000000..f2f97385 --- /dev/null +++ b/src/Container/ErrorHandlerFactory.php @@ -0,0 +1,24 @@ +get(TemplatedErrorResponseGenerator::class) + ); + } +} diff --git a/src/Container/NotFoundHandlerFactory.php b/src/Container/NotFoundHandlerFactory.php new file mode 100644 index 00000000..30946c58 --- /dev/null +++ b/src/Container/NotFoundHandlerFactory.php @@ -0,0 +1,24 @@ +get(TemplateRendererInterface::class), + new Response() + ); + } +} diff --git a/src/Container/TemplatedErrorResponseGeneratorFactory.php b/src/Container/TemplatedErrorResponseGeneratorFactory.php new file mode 100644 index 00000000..113540ab --- /dev/null +++ b/src/Container/TemplatedErrorResponseGeneratorFactory.php @@ -0,0 +1,26 @@ +has('config') ? $container->get('config') : []; + $debug = isset($config['debug']) ? $config['debug'] : false; + + return new TemplatedErrorResponseGenerator( + $container->get(TemplateRendererInterface::class), + $debug + ); + } +} diff --git a/src/NotFoundHandler.php b/src/NotFoundHandler.php new file mode 100644 index 00000000..dd27dc17 --- /dev/null +++ b/src/NotFoundHandler.php @@ -0,0 +1,69 @@ +renderer = $renderer; + $this->responsePrototype = $responsePrototype; + } + + /** + * Proxy to process() + * + * Proxies to process, after first wrapping the `$next` argument using the + * CallableDelegateDecorator. + * + * @param ServerRequestInterface $request + * @param ResponseInterface $response + * @param callable $next + * + * @return ResponseInterface + */ + public function __invoke(ServerRequestInterface $request, ResponseInterface $response, callable $next) + { + return $this->process($request, new CallableDelegateDecorator($next, $response)); + } + + /** + * Creates and returns a 404 response. + * + * @param ServerRequestInterface $request Ignored. + * @param DelegateInterface $delegate Ignored. + * + * @return ResponseInterface + */ + public function process(ServerRequestInterface $request, DelegateInterface $delegate) + { + $response = $this->responsePrototype->withStatus(404); + $response->getBody()->write( + $this->renderer->render('error::404') + ); + + return $response; + } +} diff --git a/src/TemplatedErrorResponseGenerator.php b/src/TemplatedErrorResponseGenerator.php new file mode 100644 index 00000000..f2da6dc3 --- /dev/null +++ b/src/TemplatedErrorResponseGenerator.php @@ -0,0 +1,38 @@ +renderer = $renderer; + $this->isDevelopmentMode = $isDevelopmentMode; + } + + public function __invoke($e, ServerRequestInterface $request, ResponseInterface $response) + { + $response = $response->withStatus(500); + $response->getBody()->write($this->renderer->render('error::error', [ + 'exception' => $e, + 'development_mode' => $this->isDevelopmentMode, + 'status' => $response->getStatusCode(), + 'reason' => $response->getReasonPhrase(), + ])); + + return $response; + } +} From adfd23ba07aa1d5f7a9b429956c0b13390c4a8dc Mon Sep 17 00:00:00 2001 From: Geert Eltink Date: Fri, 11 Nov 2016 15:53:30 +0100 Subject: [PATCH 2/2] Make the error templates configurable --- src/Container/NotFoundHandlerFactory.php | 11 ++++++++++- .../TemplatedErrorResponseGeneratorFactory.php | 5 +++++ src/NotFoundHandler.php | 7 +++++-- src/TemplatedErrorResponseGenerator.php | 5 ++++- 4 files changed, 24 insertions(+), 4 deletions(-) diff --git a/src/Container/NotFoundHandlerFactory.php b/src/Container/NotFoundHandlerFactory.php index 30946c58..55941aaa 100644 --- a/src/Container/NotFoundHandlerFactory.php +++ b/src/Container/NotFoundHandlerFactory.php @@ -16,9 +16,18 @@ class NotFoundHandlerFactory { public function __invoke(ContainerInterface $container) { + $config = $container->has('config') + ? $container->get('config') + : []; + + $template = isset($config['zend-expressive']['error_handler']['template_404']) + ? $config['zend-expressive']['error_handler']['template_404'] + : 'error/404'; + return new NotFoundHandler( $container->get(TemplateRendererInterface::class), - new Response() + new Response(), + $template ); } } diff --git a/src/Container/TemplatedErrorResponseGeneratorFactory.php b/src/Container/TemplatedErrorResponseGeneratorFactory.php index 113540ab..2f021ddc 100644 --- a/src/Container/TemplatedErrorResponseGeneratorFactory.php +++ b/src/Container/TemplatedErrorResponseGeneratorFactory.php @@ -18,8 +18,13 @@ public function __invoke(ContainerInterface $container) $config = $container->has('config') ? $container->get('config') : []; $debug = isset($config['debug']) ? $config['debug'] : false; + $template = isset($config['zend-expressive']['error_handler']['template_error']) + ? $config['zend-expressive']['error_handler']['template_error'] + : 'error/error'; + return new TemplatedErrorResponseGenerator( $container->get(TemplateRendererInterface::class), + $template, $debug ); } diff --git a/src/NotFoundHandler.php b/src/NotFoundHandler.php index dd27dc17..1b876125 100644 --- a/src/NotFoundHandler.php +++ b/src/NotFoundHandler.php @@ -20,16 +20,19 @@ class NotFoundHandler implements ServerMiddlewareInterface private $responsePrototype; + private $template; + /** * NotFoundHandler constructor. * * @param TemplateRendererInterface $renderer * @param ResponseInterface $responsePrototype */ - public function __construct(TemplateRendererInterface $renderer, ResponseInterface $responsePrototype) + public function __construct(TemplateRendererInterface $renderer, ResponseInterface $responsePrototype, $template) { $this->renderer = $renderer; $this->responsePrototype = $responsePrototype; + $this->template = $template; } /** @@ -61,7 +64,7 @@ public function process(ServerRequestInterface $request, DelegateInterface $dele { $response = $this->responsePrototype->withStatus(404); $response->getBody()->write( - $this->renderer->render('error::404') + $this->renderer->render($this->template) ); return $response; diff --git a/src/TemplatedErrorResponseGenerator.php b/src/TemplatedErrorResponseGenerator.php index f2da6dc3..e1fc2317 100644 --- a/src/TemplatedErrorResponseGenerator.php +++ b/src/TemplatedErrorResponseGenerator.php @@ -17,10 +17,13 @@ class TemplatedErrorResponseGenerator private $renderer; - public function __construct(TemplateRendererInterface $renderer, $isDevelopmentMode = false) + private $template; + + public function __construct(TemplateRendererInterface $renderer, $template, $isDevelopmentMode = false) { $this->renderer = $renderer; $this->isDevelopmentMode = $isDevelopmentMode; + $this->template = $template; } public function __invoke($e, ServerRequestInterface $request, ResponseInterface $response)