Skip to content

Instantly share code, notes, and snippets.

@kolomiec-valeriy
Created June 27, 2019 11:19
Show Gist options
  • Save kolomiec-valeriy/50fff1dc4f779782e09425aad90b458a to your computer and use it in GitHub Desktop.
Save kolomiec-valeriy/50fff1dc4f779782e09425aad90b458a to your computer and use it in GitHub Desktop.
<?php
namespace App\EventListener;
use App\Exception\JsonHttpException;
use Psr\Log\LoggerInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
class ExceptionListener
{
/**
* @var LoggerInterface
*/
private $logger;
public function __construct(LoggerInterface $logger)
{
$this->logger = $logger;
}
public function onKernelException(GetResponseForExceptionEvent $event)
{
$request = $event->getRequest();
$exception = $event->getException();
$apiUrlPattern = '/^\/api\/v\d+(\.{1}\d+)?\//';
if ($exception instanceof JsonHttpException) {
$errorData = [
'error' => [
'code' => $exception->getStatusCode(),
'message' => $exception->getMessage(),
'fields' => $exception->getData()
]
];
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 \ErrorException && preg_match($apiUrlPattern, $request->getPathInfo())) {
$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($apiUrlPattern, $request->getPathInfo())
&& $exception instanceof HttpExceptionInterface && 403 == $exception->getStatusCode()) {
$errorData = [
'error' => [
'code' => $exception->getStatusCode(),
'message' => 'Access denied',
]
];
$response = new JsonResponse($errorData);
$event->setResponse($response);
$this->logger->error($exception->getMessage(), $errorData);
return $event;
}
if ($exception instanceof NotFoundHttpException && preg_match($apiUrlPattern, $request->getPathInfo())) {
$errorData = [
'error' => [
'code' => $exception->getStatusCode(),
'message' => 'Not found',
]
];
$response = new JsonResponse($errorData);
$event->setResponse($response);
$this->logger->error($exception->getMessage(), $errorData);
return $event;
}
return $event;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment