From 0ef1e416c63d665c0bc00425def2e7bf7c8010ad Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Tue, 26 Jul 2016 09:54:13 +0200 Subject: [PATCH] Created middleware to catch rest errors and return JSON responses --- .../autoload/middleware-pipeline.global.php | 6 -- .../config/middleware-pipeline.config.php | 9 +++ module/Rest/config/services.config.php | 2 + .../Error/ResponseTypeMiddleware.php | 59 +++++++++++++++++++ 4 files changed, 70 insertions(+), 6 deletions(-) create mode 100644 module/Rest/src/Middleware/Error/ResponseTypeMiddleware.php diff --git a/config/autoload/middleware-pipeline.global.php b/config/autoload/middleware-pipeline.global.php index ca116a95..6e72ea1f 100644 --- a/config/autoload/middleware-pipeline.global.php +++ b/config/autoload/middleware-pipeline.global.php @@ -26,11 +26,5 @@ return [ ], 'priority' => 1, ], - - 'error' => [ - 'middleware' => [], - 'error' => true, - 'priority' => -10000, - ], ], ]; diff --git a/module/Rest/config/middleware-pipeline.config.php b/module/Rest/config/middleware-pipeline.config.php index 78c20c38..4d908635 100644 --- a/module/Rest/config/middleware-pipeline.config.php +++ b/module/Rest/config/middleware-pipeline.config.php @@ -12,5 +12,14 @@ return [ ], 'priority' => 5, ], + + 'rest-error' => [ + 'path' => '/rest', + 'middleware' => [ + Middleware\Error\ResponseTypeMiddleware::class, + ], + 'error' => true, + 'priority' => -10000, + ], ], ]; diff --git a/module/Rest/config/services.config.php b/module/Rest/config/services.config.php index aff4cc96..44ce97f0 100644 --- a/module/Rest/config/services.config.php +++ b/module/Rest/config/services.config.php @@ -19,6 +19,8 @@ return [ Middleware\CrossDomainMiddleware::class => InvokableFactory::class, Middleware\CheckAuthenticationMiddleware::class => AnnotatedFactory::class, + + Middleware\Error\ResponseTypeMiddleware::class => AnnotatedFactory::class, ], ], diff --git a/module/Rest/src/Middleware/Error/ResponseTypeMiddleware.php b/module/Rest/src/Middleware/Error/ResponseTypeMiddleware.php new file mode 100644 index 00000000..a7e2c5e8 --- /dev/null +++ b/module/Rest/src/Middleware/Error/ResponseTypeMiddleware.php @@ -0,0 +1,59 @@ +translator = $translator; + } + + /** + * Process an incoming error, along with associated request and response. + * + * Accepts an error, a server-side request, and a response instance, and + * does something with them; if further processing can be done, it can + * delegate to `$out`. + * + * @see MiddlewareInterface + * @param mixed $error + * @param Request $request + * @param Response $response + * @param null|callable $out + * @return null|Response + */ + public function __invoke($error, Request $request, Response $response, callable $out = null) + { + $accept = $request->getHeader('Accept'); + if (! empty(array_intersect(['application/json', 'text/json', 'application/x-json'], $accept))) { + $status = $response->getStatusCode(); + $status = $status >= 400 ? $status : 500; + + return new JsonResponse([ + 'error' => RestUtils::UNKNOWN_ERROR, + 'message' => $this->translator->translate('Unknown error'), + ], $status); + } + + return $out($request, $response, $error); + } +}