<?php
namespace App\EventListener;
use App\Exception\JsonHttpException;
use Psr\Log\LoggerInterface;
use Symfony\Component\Debug\Exception\ContextErrorException;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
class ExceptionListener
{
/**
* @var LoggerInterface
*/
private $logger;
public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
}
public function onKernelException(ExceptionEvent $event)
{
$request = $event->getRequest();
$exception = $event->getThrowable();
if ($exception instanceof JsonHttpException) {
$errorData = [
'error' => [
'code' => $exception->getStatusCode(),
'message' => $exception->getMessage(),
]
];
if (($data = $exception->getData())) {
if (isset($data['code'])) {
$errorData['error']['code'] = $data['code'];
}
}
$response = new JsonResponse($errorData);
$event->setResponse($response);
$this->logger->error($exception->getMessage(), $errorData);
return $event;
}
if ($exception && $exception instanceof ContextErrorException) {
$errorData = [
'error' => [
'code' => 1,
'message' => $exception->getMessage(),
]
];
$response = new JsonResponse($errorData);
$event->setResponse($response);
$this->logger->error($exception->getMessage(), $errorData);
return $event;
}
if ((bool) $exception && preg_match('/^\/api\/v\d+(\.{1}\d+)?\//', $request->getPathInfo())
&& $exception instanceof HttpExceptionInterface && $exception->getStatusCode() == 403) {
$errorData = [
'error' => [
'code' => $exception->getStatusCode(),
'message' => 'Access denied',
]
];
$response = new JsonResponse($errorData);
$event->setResponse($response);
$this->logger->error($exception->getMessage(), $errorData);
return $event;
}
return $event;
}
}