<?php
namespace Agediss\Core\EventSubscriber;
use Agediss\Core\Exception\Api\ApiException;
use Agediss\Core\Exception\LogoutException;
use Agediss\Core\Utils\ApiCodeEnum;
use Agediss\Core\Utils\ApiResponseMessage;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Exception\HttpException;
/**
* Class ApiExceptionSubscriber.
*/
class ApiExceptionSubscriber implements EventSubscriberInterface
{
/**
* @var LoggerInterface
*/
private $logger;
/**
* ApiExceptionSubscriber constructor.
*/
public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
}
/**
* Cette methode est appelé dès lors qu'une exception n'est pas catché.
* Ici on ne traite que les exception de type 'ApiException' pour quelle renvoi du json.
*/
public function onKernelException(ExceptionEvent $event)
{
$e = $event->getThrowable();
if (!($e instanceof HttpException) && !($e instanceof ApiException)) {
if ('dev' === getenv('APP_ENV')) {
return;
}
$e = new ApiException(
new ApiResponseMessage($e->getMessage(), ApiCodeEnum::API_INTERNAL_ERROR),
500
);
$this->logger->error("une erreur c'est produite dans l'application MESSAGE : {$e->getMessage()}", ['exception' => $e->getApiResponseMessage()->getData()]);
$response = new JsonResponse(
$e->getApiResponseMessage()->getData(),
$e->getCode()
);
}
if ($e instanceof LogoutException) {
$response = new RedirectResponse($_ENV['HOST_API_SSO'].'?connexionFailed='.$e->getApiResponseMessage()->getMessage());
} else if ($e instanceof ApiException) {
$this->logger->error("une erreur c'est produite dans une requete api MESSAGE : {$e->getMessage()}", ['exception' => $e->getApiResponseMessage()->getData()]);
$response = new JsonResponse(
$e->getApiResponseMessage()->getData(),
$e->getCode()
);
}
if ($e instanceof HttpException) {
$apiExceptionMsg = new ApiResponseMessage($e->getMessage(), ApiCodeEnum::INVALID_ADDRESS);
$this->logger->error("une erreur c'est produite dans une requete api MESSAGE : {$e->getMessage()}");
$response = new JsonResponse(
$apiExceptionMsg->getData(),
$e->getStatusCode()
);
}
$response->headers->set('Content-Type', 'application/json');
$event->setResponse($response);
}
/**
* @return array
*/
public static function getSubscribedEvents()
{
return [
'kernel.exception' => 'onKernelException',
];
}
}