src/EventListener/DeserializeListener.php line 33

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace App\EventListener;
  4. use ApiPlatform\Core\EventListener\DeserializeListener as DecoratedListener;
  5. use ApiPlatform\Core\Util\RequestAttributesExtractor;
  6. use ApiPlatform\Serializer\SerializerContextBuilderInterface;
  7. use App\Traits\FormDataForPutTrait;
  8. use Symfony\Component\HttpFoundation\Request;
  9. use Symfony\Component\HttpKernel\Event\RequestEvent;
  10. use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
  11. final class DeserializeListener
  12. {
  13.     use FormDataForPutTrait;
  14.     private DecoratedListener $decorated;
  15.     private DenormalizerInterface $denormalizer;
  16.     private SerializerContextBuilderInterface $serializerContextBuilder;
  17.     public function __construct(
  18.         DenormalizerInterface $denormalizer,
  19.         SerializerContextBuilderInterface $serializerContextBuilder,
  20.         DecoratedListener $decorated
  21.     ) {
  22.         $this->denormalizer $denormalizer;
  23.         $this->serializerContextBuilder $serializerContextBuilder;
  24.         $this->decorated $decorated;
  25.     }
  26.     public function onKernelRequest(RequestEvent $event): void
  27.     {
  28.         $request $event->getRequest();
  29.         if ($request->isMethodCacheable() || $request->isMethod(Request::METHOD_DELETE)) {
  30.             return;
  31.         }
  32.         if ('form' === $request->getContentType()) {
  33.             $this->denormalizeFromRequest($request);
  34.         } else {
  35.             $this->decorated->onKernelRequest($event);
  36.         }
  37.     }
  38.     private function denormalizeFromRequest(Request $request): void
  39.     {
  40.         $this->activeHttpPut($request);
  41.         if (!$attributes RequestAttributesExtractor::extractAttributes($request)) {
  42.             return;
  43.         }
  44.         $context $this->serializerContextBuilder->createFromRequest($requestfalse$attributes);
  45.         $populated $request->attributes->get('data');
  46.         if (null !== $populated) {
  47.             $context['object_to_populate'] = $populated;
  48.         }
  49.         $data $request->request->all();
  50.         $files $request->files->all();
  51.         $route $request->attributes->get('_route');
  52.         $booleanFields = [
  53.             'api_letters_post_collection' => ['isRead''isArchived'],
  54.             'api_letters_put_item' => ['isRead''isArchived'],
  55.             'api_letter_signatures_post_collection' => ['isCoursier'],
  56.             'api_letter_signatures_put_item' => ['isCoursier'],
  57.         ];
  58.         if (array_key_exists($route$booleanFields)) {
  59.             foreach ($booleanFields[$route] as $field) {
  60.                 if (isset($data[$field])) {
  61.                     $data[$field] = filter_var($data[$field], FILTER_VALIDATE_BOOLEAN);
  62.                 }
  63.             }
  64.             $request->request->replace($data);
  65.         }
  66.         $object $this->denormalizer->denormalize(array_merge($data$files), $attributes['resource_class'], null$context);
  67.         $request->attributes->set('data'$object);
  68.     }
  69. }