<?php
declare(strict_types=1);
namespace Evo\Application\Payload\Listener;
use Evo\Application\Payload\Exception\PayloadValidationException;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\ExceptionEvent;
use Symfony\Component\HttpKernel\KernelEvents;
use Symfony\Component\Serializer\SerializerInterface;
final class PayloadValidationListener implements EventSubscriberInterface
{
private SerializerInterface $serializer;
public function __construct(SerializerInterface $serializer)
{
$this->serializer = $serializer;
}
public static function getSubscribedEvents(): array
{
return [
KernelEvents::EXCEPTION => 'onException',
];
}
public function onException(ExceptionEvent $event): void
{
if (!$event->getThrowable() instanceof PayloadValidationException) {
return;
}
/** @var PayloadValidationException $exception */
$exception = $event->getThrowable();
$event->setResponse(
new JsonResponse(
$this->serializer->serialize($exception->getConstraintViolationList(), 'json'),
Response::HTTP_BAD_REQUEST,
[],
true
)
);
}
}