src/EventListener/DeserializerValidatorListener.php line 39

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use ApiPlatform\Core\Api\IriConverterInterface;
  4. use ApiPlatform\Core\Util\RequestAttributesExtractor;
  5. use App\Custom\RequestEventContentValidator;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpKernel\Event\RequestEvent;
  8. use ApiPlatform\Core\EventListener\DeserializeListener as DecoratedListener;
  9. use Symfony\Component\HttpKernel\KernelInterface;
  10. use Symfony\Component\Serializer\Exception\ExceptionInterface;
  11. use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
  12. use ApiPlatform\Core\Serializer\SerializerContextBuilderInterface;
  13. final class DeserializerValidatorListener
  14. {
  15.     private DecoratedListener $decorated;
  16.     private DenormalizerInterface $denormalizer;
  17.     private SerializerContextBuilderInterface $serializerContextBuilder;
  18.     private RequestEventContentValidator $requestEventContentValidator;
  19.     public function __construct(
  20.         DenormalizerInterface $denormalizer,
  21.         SerializerContextBuilderInterface $serializerContextBuilder,
  22.         DecoratedListener $decorated,
  23.         RequestEventContentValidator $requestEventContentValidator
  24.     )
  25.     {
  26.         $this->denormalizer $denormalizer;
  27.         $this->serializerContextBuilder $serializerContextBuilder;
  28.         $this->decorated $decorated;
  29.         $this->requestEventContentValidator $requestEventContentValidator;
  30.     }
  31.     /**
  32.      * @throws ExceptionInterface|\ReflectionException
  33.      */
  34.     public function onKernelRequest(RequestEvent $event): void {
  35.         $request $event->getRequest();
  36.         if ($request->isMethodCacheable() || $request->isMethod(Request::METHOD_DELETE)) {
  37.             return;
  38.         }
  39. //        if ($request->isMethod(Request::METHOD_POST) ||
  40. //            $request->isMethod(Request::METHOD_PUT) ||
  41. //            $request->isMethod(Request::METHOD_PATCH)
  42. //        ) {
  43. //            $this->requestContentIdDecoder->decode($request);
  44. //        }
  45.         if ('form' === $request->getContentType()) {
  46.             $this->denormalizeFormRequest($request);
  47.         } else {
  48.             $this->requestEventContentValidator->validate($event);
  49.             $this->decorated->onKernelRequest($event);
  50.         }
  51.     }
  52.     /**
  53.      * @throws ExceptionInterface
  54.      */
  55.     private function denormalizeFormRequest(Request $request): void
  56.     {
  57.         if (!$attributes RequestAttributesExtractor::extractAttributes($request)) {
  58.             return;
  59.         }
  60.         $context $this->serializerContextBuilder->createFromRequest($requestfalse$attributes);
  61.         $populated $request->attributes->get('data');
  62.         if (null !== $populated) {
  63.             $context['object_to_populate'] = $populated;
  64.         }
  65.         $data $request->request->all();
  66.         $object $this->denormalizer->denormalize($data$attributes['resource_class'], null$context);
  67.         $request->attributes->set('data'$object);
  68.     }
  69. }