src/ArgumentResolver/QueryStringRequestResolver.php line 48

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Slivki\ArgumentResolver;
  4. use Slivki\Request\QueryStringRequestInterface;
  5. use Slivki\Validator\ApiValidatorInterface;
  6. use Symfony\Component\HttpFoundation\Request;
  7. use Symfony\Component\HttpKernel\Controller\ArgumentValueResolverInterface;
  8. use Symfony\Component\HttpKernel\ControllerMetadata\ArgumentMetadata;
  9. use Symfony\Component\Serializer\Normalizer\AbstractObjectNormalizer;
  10. use Symfony\Component\Serializer\Normalizer\DenormalizerInterface;
  11. final class QueryStringRequestResolver implements ArgumentValueResolverInterface
  12. {
  13.     private DenormalizerInterface $denormalizer;
  14.     private ApiValidatorInterface $validator;
  15.     public function __construct(DenormalizerInterface $denormalizerApiValidatorInterface $validator)
  16.     {
  17.         $this->denormalizer $denormalizer;
  18.         $this->validator $validator;
  19.     }
  20.     public function supports(Request $requestArgumentMetadata $argument): bool
  21.     {
  22.         $type $argument->getType();
  23.         if (null === $type || !\class_exists($type)) {
  24.             return false;
  25.         }
  26.         $interfaces = \class_implements($type);
  27.         return isset($interfaces[QueryStringRequestInterface::class]);
  28.     }
  29.     public function resolve(Request $requestArgumentMetadata $argument): \Generator
  30.     {
  31.         $queryStringRequest $this->denormalizer->denormalize(
  32.             $request->query->all(),
  33.             $argument->getType(),
  34.             null,
  35.             [AbstractObjectNormalizer::DISABLE_TYPE_ENFORCEMENT => true],
  36.         );
  37.         $this->validator->validate($queryStringRequest);
  38.         yield $queryStringRequest;
  39.     }
  40. }