<?php
namespace App\Listener;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
final class ExceptionApiListener {
public function onKernelException(ExceptionEvent $event)
{
$exception = $event->getThrowable();
$response = new JsonResponse();
$message = sprintf(
'Exception: %s with code %s at %s:%s',
$exception->getMessage(),
$exception->getCode(),
$exception->getFile(),
$exception->getLine()
);
$data = [
'error' => true,
'message' => $message,
];
if ($exception instanceof HttpExceptionInterface) {
$response->setStatusCode($exception->getStatusCode());
$response->headers->replace($exception->getHeaders());
} else {
$response->setStatusCode(JsonResponse::HTTP_INTERNAL_SERVER_ERROR);
}
$response->setData($data);
$request = $event->getRequest();
if (strpos($request->getPathInfo(), '/api') === 0) {
$event->setResponse($response);
}
}
}