Skip to content

Instantly share code, notes, and snippets.

@geerteltink
Last active October 5, 2016 13:07
Show Gist options
  • Save geerteltink/a70edfbd9d180e598a95ecae7ec45ecb to your computer and use it in GitHub Desktop.
Save geerteltink/a70edfbd9d180e598a95ecae7ec45ecb to your computer and use it in GitHub Desktop.
JsonErrorHandler
<?php
declare(strict_types = 1);
namespace Application\ErrorHandler;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Psr\Log\LoggerInterface;
use Zend\Diactoros\Response\JsonResponse;
use Zend\Stratigility\ErrorMiddlewareInterface;
class JsonErrorHandler implements ErrorMiddlewareInterface
{
private $logger;
public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
}
public function __invoke($error, Request $request, Response $response, callable $out = null) : Response
{
if ($error instanceof \Throwable) {
$status = $response->getReasonPhrase() ? $error->getCode() : 400;
// Ensure a valid HTTP status
if (! is_numeric($status)
|| ($status < 400)
|| ($status > 599)
) {
$status = 500;
}
$response = new JsonResponse([], $status);
$errors = [
'errors' => [
'status' => $status,
'title' => $response->getReasonPhrase() ?: 'Bad Request',
'detail' => $error->getMessage(),
'links' => [
'related' => 'http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html'
]
]
];
$this->logger->critical('Error ({code}): {message} in {file}:{line}', [
'code' => $error->getCode(),
'message' => $error->getMessage(),
'file' => $error->getFile(),
'line' => $error->getLine(),
]);
return new JsonResponse($errors, $response->getStatusCode());
}
return $out($request, $response, $error);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment