<?php
namespace AppBundle\Event;
use AppBundle\Exception\GitHubCallException;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Contracts\Translation\TranslatorInterface;
use Twig\Environment;
/**
* Class GitHubCallExceptionListener
* @package AppBundle\Event
*/
class GitHubCallExceptionListener
{
/**
* @var Environment
*/
private $twig;
/**
* @var TranslatorInterface
*/
private $translator;
public function __construct(Environment $twig, TranslatorInterface $translator)
{
$this->twig = $twig;
$this->translator = $translator;
}
/**
* @param ExceptionEvent $event
*
* @throws \Exception
*/
public function onKernelException(ExceptionEvent $event): void
{
$exception = $event->getThrowable();
if ($exception instanceof GitHubCallException) {
$httpCode = $exception->getCode() ?? 500;
if (!$exception->isAjaxCall()) {
$rendered = $this->twig->render('@Twig/Exception/error.html.twig', [
'errorDesc' => $this->translator->trans($exception->getMessage()),
'httpCode' => $httpCode,
]);
$event->setResponse(new Response($rendered, Response::HTTP_INTERNAL_SERVER_ERROR));
} else {
$event->setResponse(new JsonResponse(['error' => true, 'errorDesc' => $this->translator->trans($exception->getMessage())]));
}
} elseif ($exception instanceof NotFoundHttpException) {
$httpCode = $exception->getStatusCode();
$rendered = $this->twig->render('@Twig/Exception/error.html.twig', [
'errorDesc' => $this->translator->trans($exception->getMessage()),
'httpCode' => $httpCode,
]);
$event->setResponse(new Response($rendered, $httpCode));
}
}
}