vendor/sylius/resource-bundle/src/Bundle/Controller/RequestConfigurationFactory.php line 56

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Sylius package.
  4.  *
  5.  * (c) Paweł Jędrzejewski
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. declare(strict_types=1);
  11. namespace Sylius\Bundle\ResourceBundle\Controller;
  12. use Sylius\Component\Resource\Metadata\MetadataInterface;
  13. use Symfony\Component\HttpFoundation\Request;
  14. final class RequestConfigurationFactory implements RequestConfigurationFactoryInterface
  15. {
  16.     private const API_VERSION_HEADER 'Accept';
  17.     private const API_GROUPS_HEADER 'Accept';
  18.     private const API_VERSION_REGEXP '/(v|version)=(?P<version>[0-9\.]+)/i';
  19.     private const API_GROUPS_REGEXP '/(g|groups)=(?P<groups>[a-z,_\s]+)/i';
  20.     /** @var ParametersParserInterface */
  21.     private $parametersParser;
  22.     /**
  23.      * @var string
  24.      * @psalm-var class-string<RequestConfiguration>
  25.      */
  26.     private $configurationClass;
  27.     /** @var array */
  28.     private $defaultParameters;
  29.     /**
  30.      * @psalm-param class-string<RequestConfiguration> $configurationClass
  31.      */
  32.     public function __construct(ParametersParserInterface $parametersParserstring $configurationClass, array $defaultParameters = [])
  33.     {
  34.         $this->parametersParser $parametersParser;
  35.         $this->configurationClass $configurationClass;
  36.         $this->defaultParameters $defaultParameters;
  37.     }
  38.     /**
  39.      * {@inheritdoc}
  40.      */
  41.     public function create(MetadataInterface $metadataRequest $request): RequestConfiguration
  42.     {
  43.         $parameters array_merge($this->defaultParameters$this->parseApiParameters($request));
  44.         $parameters $this->parametersParser->parseRequestValues($parameters$request);
  45.         return new $this->configurationClass($metadata$request, new Parameters($parameters));
  46.     }
  47.     /**
  48.      * @throws \InvalidArgumentException
  49.      */
  50.     private function parseApiParameters(Request $request): array
  51.     {
  52.         $parameters $request->attributes->get('_sylius', []);
  53.         /** @var string[] $apiVersionHeaders */
  54.         $apiVersionHeaders $request->headers->get(self::API_VERSION_HEADERnullfalse);
  55.         foreach ($apiVersionHeaders as $apiVersionHeader) {
  56.             if (preg_match(self::API_VERSION_REGEXP$apiVersionHeader$matches)) {
  57.                 $parameters['serialization_version'] = $matches['version'];
  58.             }
  59.         }
  60.         $allowedSerializationGroups array_merge(
  61.             $parameters['allowed_serialization_groups'] ?? [],
  62.             $parameters['serialization_groups'] ?? []
  63.         );
  64.         /** @var string[] $apiGroupsHeaders */
  65.         $apiGroupsHeaders $request->headers->get(self::API_GROUPS_HEADERnullfalse);
  66.         foreach ($apiGroupsHeaders as $apiGroupsHeader) {
  67.             if (preg_match(self::API_GROUPS_REGEXP$apiGroupsHeader$matches)) {
  68.                 $parameters['serialization_groups'] = array_intersect($allowedSerializationGroupsarray_map('trim'explode(','$matches['groups'])));
  69.             }
  70.         }
  71.         return $parameters;
  72.     }
  73. }