<?php declare(strict_types=1);
namespace PPApi\EventSubscriber;
use PPApi\Model\V1\APIError;
use PPApi\Model\V1\APIException;
use PPApi\Model\V1\APIExceptionResponse;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Symfony\Component\HttpKernel\KernelEvents;
class JSONErrorHandler implements EventSubscriberInterface
{
public function onKernelException(ExceptionEvent $event)
{
if($event->getResponse() instanceof JsonResponse){
return;
}
$err = $event->getThrowable();
if($err instanceof APIException){
$event->setResponse(new JsonResponse($err->getError(), $err->getStatusCode()));
return;
}
if($err instanceof HttpExceptionInterface){
$error = new APIError($err->getStatusCode(), $err->getMessage());
$response = new JsonResponse($error, $err->getStatusCode());
$event->setResponse($response);
return;
}
$exception = new APIExceptionResponse(JsonResponse::HTTP_INTERNAL_SERVER_ERROR, $err->getMessage(), get_class($err));
$response = new JsonResponse($exception,JsonResponse::HTTP_INTERNAL_SERVER_ERROR);
$event->setResponse($response);
}
public static function getSubscribedEvents()
{
return [
// priority should be < 0 to let the logger catch this exception
KernelEvents::EXCEPTION => ['onKernelException', -5]
];
}
}