2016-07-27 20:17:23 +02:00
|
|
|
<?php
|
|
|
|
|
namespace Shlinkio\Shlink\Rest\Expressive;
|
|
|
|
|
|
2016-07-28 09:40:36 +02:00
|
|
|
use Psr\Http\Message\ServerRequestInterface as Request;
|
2016-07-27 20:17:23 +02:00
|
|
|
use Psr\Http\Message\ResponseInterface as Response;
|
|
|
|
|
use Shlinkio\Shlink\Common\Expressive\ErrorHandlerInterface;
|
|
|
|
|
use Zend\Diactoros\Response\JsonResponse;
|
2016-07-28 09:40:36 +02:00
|
|
|
use Zend\Expressive\Router\RouteResult;
|
2016-07-27 20:17:23 +02:00
|
|
|
|
|
|
|
|
class JsonErrorHandler implements ErrorHandlerInterface
|
|
|
|
|
{
|
|
|
|
|
/**
|
|
|
|
|
* Final handler for an application.
|
|
|
|
|
*
|
|
|
|
|
* @param Request $request
|
|
|
|
|
* @param Response $response
|
|
|
|
|
* @param null|mixed $err
|
|
|
|
|
* @return Response
|
|
|
|
|
*/
|
|
|
|
|
public function __invoke(Request $request, Response $response, $err = null)
|
|
|
|
|
{
|
2016-07-28 09:40:36 +02:00
|
|
|
$hasRoute = $request->getAttribute(RouteResult::class) !== null;
|
|
|
|
|
$isNotFound = ! $hasRoute && ! isset($err);
|
|
|
|
|
if ($isNotFound) {
|
|
|
|
|
$responsePhrase = 'Not found';
|
|
|
|
|
$status = 404;
|
|
|
|
|
} else {
|
|
|
|
|
$status = $response->getStatusCode();
|
|
|
|
|
$responsePhrase = $status < 400 ? 'Internal Server Error' : $response->getReasonPhrase();
|
|
|
|
|
$status = $status < 400 ? 500 : $status;
|
|
|
|
|
}
|
2016-07-27 20:17:23 +02:00
|
|
|
|
|
|
|
|
return new JsonResponse([
|
|
|
|
|
'error' => $this->responsePhraseToCode($responsePhrase),
|
|
|
|
|
'message' => $responsePhrase,
|
|
|
|
|
], $status);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @param string $responsePhrase
|
|
|
|
|
* @return string
|
|
|
|
|
*/
|
|
|
|
|
protected function responsePhraseToCode($responsePhrase)
|
|
|
|
|
{
|
|
|
|
|
return strtoupper(str_replace(' ', '_', $responsePhrase));
|
|
|
|
|
}
|
|
|
|
|
}
|