<?php
declare(strict_types=1);
namespace OnlineOcenka\InfonotModule\EventSubscriber;
use OnlineOcenka\InfonotModule\Exception\RestApi\V2\ErrorValidationException;
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;
class ExceptionSubscriber implements EventSubscriberInterface
{
public function __construct(
private LoggerInterface $logger,
) {
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::EXCEPTION => 'onKernelException',
];
}
public function onKernelException(ExceptionEvent $event): void
{
$exception = $event->getThrowable();
if(!$exception instanceof ErrorValidationException) {
return;
}
$data = [
'reason' => $exception->getMessage() ?: 'Произошла внутренняя ошибка'
];
if($exception->errors) {
$data['errors'] = $exception->errors;
}
if($exception->getCode()) {
$data['code'] = $exception->getCode();
}
$event->setResponse(new JsonResponse($data, status: $exception->statusCode));
$this->logger->error($exception);
return;
}
}