<?php
namespace App\Subscriber;
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpKernel\Event\RequestEvent;
use Symfony\Component\HttpKernel\KernelEvents;
class JsonRequestTransformerSubscriber implements EventSubscriberInterface
{
public function onKernelRequest(RequestEvent $event)
{
if (!$this->isSupport($event->getRequest())) {
return;
}
if (false === $this->transform($event->getRequest())) {
$response = new Response('Unable to parse request.', Response::HTTP_BAD_REQUEST);
$event->setResponse($response);
}
}
private function isSupport(Request $request)
{
return "json" === $request->getContentType() && $request->getContent();
}
private function transform(Request $request)
{
$data = json_decode($request->getContent(), true);
if (json_last_error() !== JSON_ERROR_NONE) {
return false;
}
if (is_array($data)) {
$request->request->replace($data);
}
return true;
}
public static function getSubscribedEvents()
{
return [
KernelEvents::REQUEST => [['onKernelRequest', 1]]
];
}
}