src/EventListener/DeserializeListener.php line 27

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use ApiPlatform\Core\Util\RequestAttributesExtractor;
  4. use Symfony\Component\HttpFoundation\Request;
  5. use Symfony\Component\HttpKernel\Event\RequestEvent;
  6. use ApiPlatform\Core\EventListener\DeserializeListener as DecoratedListener;
  7. use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
  8. use ApiPlatform\Core\Serializer\SerializerContextBuilderInterface;
  9. class DeserializeListener
  10. {
  11.     private $decorated;
  12.     private $denormalizer;
  13.     private $serializerContextBuilder;
  14.     public function __construct(DenormalizerInterface $denormalizerSerializerContextBuilderInterface $serializerContextBuilderDecoratedListener $decorated)
  15.     {
  16.         $this->denormalizer $denormalizer;
  17.         $this->serializerContextBuilder $serializerContextBuilder;
  18.         $this->decorated $decorated;
  19.     }
  20.     public function onKernelRequest(RequestEvent $event): void {
  21.         $request $event->getRequest();
  22.         if ($request->isMethodCacheable(false) || $request->isMethod(Request::METHOD_DELETE)) {
  23.             return;
  24.         }
  25.         if ('form' === $request->getContentType()) {
  26.             $this->denormalizeFormRequest($request);
  27.         } else {
  28.             $this->decorated->onKernelRequest($event);
  29.         }
  30.     }
  31.     private function denormalizeFormRequest(Request $request): void
  32.     {
  33.         if (!$attributes RequestAttributesExtractor::extractAttributes($request)) {
  34.             return;
  35.         }
  36.         $context $this->serializerContextBuilder->createFromRequest($requestfalse$attributes);
  37.         $populated $request->attributes->get('data');
  38.         if (null !== $populated) {
  39.             $context['object_to_populate'] = $populated;
  40.         }
  41.         $data $request->request->all();
  42.         $object $this->denormalizer->denormalize($data$attributes['resource_class'], null$context);
  43.         $request->attributes->set('data'$object);
  44.     }
  45. }