diff options
Diffstat (limited to 'src/Router/Middleware/ErrorHandler.php')
-rw-r--r-- | src/Router/Middleware/ErrorHandler.php | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/src/Router/Middleware/ErrorHandler.php b/src/Router/Middleware/ErrorHandler.php new file mode 100644 index 0000000..789c455 --- /dev/null +++ b/src/Router/Middleware/ErrorHandler.php @@ -0,0 +1,54 @@ +<?php + +namespace Jasny\Router\Middleware; + +use Psr\Http\Message\ServerRequestInterface; +use Psr\Http\Message\ResponseInterface; + +/** + * Handle error in following middlewares/app actions + */ +class ErrorHandler +{ + /** + * Run middleware action + * + * @param ServerRequestInterface $request + * @param ResponseInterface $response + * @param callback $next + * @return ResponseInterface + */ + public function __invoke(ServerRequestInterface $request, ResponseInterface $response, $next = null) + { + if ($next && !is_callable($next)) { + throw new \InvalidArgumentException("'next' should be a callback"); + } + + $error = false; + + try { + $response = $next ? call_user_func($next, $request, $response) : $response; + } catch(\Throwable $e) { + $error = true; + } catch(\Exception $e) { #This block can be removed when migrating to PHP7, because Throwable represents both Exception and Error + $error = true; + } + + return $error ? $this->handleError($response) : $response; + } + + /** + * Handle caught error + * + * @param ResponseInterface $response + * @return ResponseInterface + */ + protected function handleError($response) + { + $body = $response->getBody(); + $body->rewind(); + $body->write('Unexpected error'); + + return $response->withStatus(500, 'Internal Server Error')->withBody($body); + } +} |