<?php
namespace App\EventSubscriber;
use Psr\Log\LoggerInterface;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Contracts\Translation\TranslatorInterface;
class ApiExceptionSubscriber implements EventSubscriberInterface
{
private $translator;
/**
* @var LoggerInterface
*/
private $apiLogger;
public function __construct(TranslatorInterface $translator, LoggerInterface $apiLogger)
{
$this->translator = $translator;
$this->apiLogger = $apiLogger;
}
public static function getSubscribedEvents()
{
// return the subscribed events, their methods and priorities
return [
KernelEvents::EXCEPTION => 'onException',
];
}
/**
* Handle Exception body response for Api calls
*
* @param ExceptionEvent $event
*/
public function onException(ExceptionEvent $event)
{
// Get exception
$exception = $event->getThrowable();
// Check for API excepion only
if (get_class($exception) !== 'App\Exception\ApiException'){
return;
}
// Prepare Json response
$responseData = [
'error' => true,
'code' => $exception->getCode(),
'type' => $exception->getErrorType(),
'message' => $this->translator->trans($exception->getMessage(), [], 'api'),
'extraData' => $exception->getExtraData(),
];
$this->apiLogger->error(json_encode(array_merge($responseData, ['request' => $event->getRequest()->getContent()])));
$response = new JsonResponse($responseData);
$response->headers->set('Content-Type', 'application/problem+json');
$event->setResponse($response);
}
}