src/EventListener/DeserializeListener.php line 19

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