src/Ui/Http/Rest/EventSubscriber/JsonBodyParserSubscriber.php line 24

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Ui\Http\Rest\EventSubscriber;
  4. use const JSON_THROW_ON_ERROR;
  5. use Symfony\Component\EventDispatcher\EventSubscriberInterface;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpFoundation\Response;
  8. use Symfony\Component\HttpKernel\Event\RequestEvent;
  9. use Symfony\Component\HttpKernel\KernelEvents;
  10. use Throwable;
  11. class JsonBodyParserSubscriber implements EventSubscriberInterface
  12. {
  13.     public static function getSubscribedEvents() : array
  14.     {
  15.         return [
  16.             KernelEvents::REQUEST => 'onKernelRequest',
  17.         ];
  18.     }
  19.     public function onKernelRequest(RequestEvent $event) : void
  20.     {
  21.         $request $event->getRequest();
  22.         if (!$this->isJsonRequest($request)) {
  23.             return;
  24.         }
  25.         $content $request->getContent();
  26.         if (empty($content)) {
  27.             return;
  28.         }
  29.         if (!$this->transformJsonBody($request)) {
  30.             $response = new Response('Unable to parse json request.'Response::HTTP_BAD_REQUEST);
  31.             $event->setResponse($response);
  32.         }
  33.     }
  34.     private function isJsonRequest(Request $request) : bool
  35.     {
  36.         return 'json' === $request->getContentType();
  37.     }
  38.     private function transformJsonBody(Request $request) : bool
  39.     {
  40.         try {
  41.             $data \json_decode(
  42.                 (string) $request->getContent(),
  43.                 true,
  44.                 512,
  45.                 JSON_THROW_ON_ERROR
  46.             );
  47.         } catch (Throwable $exception) {
  48.             return false;
  49.         }
  50.         if (null === $data) {
  51.             return true;
  52.         }
  53.         $request->request->replace($data);
  54.         return true;
  55.     }
  56. }