<?php
declare(strict_types=1);
namespace App\EventListener\DataObject;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class RequestTransformerListener implements EventSubscriberInterface
{
/**
* @inheritDoc
*/
public static function getSubscribedEvents()
{
return [
KernelEvents::REQUEST => 'onKernelRequest'
];
}
public function onKernelRequest(RequestEvent $event): void
{
$request = $event->getRequest();
if (false === $this->supports($request)) {
return;
}
try {
$data = \json_decode((string) $request->getContent(), true, 512, \JSON_THROW_ON_ERROR);
if (\is_array($data)) {
$request->request->replace($data);
}
} catch (\JsonException $exception) {
$event->setResponse(new JsonResponse(['message' => $exception->getMessage()], Response::HTTP_BAD_REQUEST));
}
}
private function supports(Request $request): bool
{
return 'json' === $request->getContentType() && $request->getContent();
}
}