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

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.     private ParametersParserInterface $parametersParser;
  21.     /**
  22.      * @var string
  23.      * @psalm-var class-string<RequestConfiguration>
  24.      */
  25.     private $configurationClass;
  26.     private array $defaultParameters;
  27.     /**
  28.      * @psalm-param class-string<RequestConfiguration> $configurationClass
  29.      */
  30.     public function __construct(ParametersParserInterface $parametersParserstring $configurationClass, array $defaultParameters = [])
  31.     {
  32.         $this->parametersParser $parametersParser;
  33.         $this->configurationClass $configurationClass;
  34.         $this->defaultParameters $defaultParameters;
  35.     }
  36.     public function create(MetadataInterface $metadataRequest $request): RequestConfiguration
  37.     {
  38.         $parameters array_merge($this->defaultParameters$this->parseApiParameters($request));
  39.         $parameters $this->parametersParser->parseRequestValues($parameters$request);
  40.         /** @psalm-suppress UnsafeInstantiation */
  41.         return new $this->configurationClass($metadata$request, new Parameters($parameters));
  42.     }
  43.     /**
  44.      * @throws \InvalidArgumentException
  45.      */
  46.     private function parseApiParameters(Request $request): array
  47.     {
  48.         $parameters $request->attributes->get('_sylius', []);
  49.         /** @var string[] $apiVersionHeaders */
  50.         $apiVersionHeaders $request->headers->all(self::API_VERSION_HEADER);
  51.         foreach ($apiVersionHeaders as $apiVersionHeader) {
  52.             if (preg_match(self::API_VERSION_REGEXP$apiVersionHeader$matches)) {
  53.                 $parameters['serialization_version'] = $matches['version'];
  54.             }
  55.         }
  56.         $allowedSerializationGroups array_merge(
  57.             $parameters['allowed_serialization_groups'] ?? [],
  58.             $parameters['serialization_groups'] ?? [],
  59.         );
  60.         /** @var string[] $apiGroupsHeaders */
  61.         $apiGroupsHeaders $request->headers->all(self::API_GROUPS_HEADER);
  62.         foreach ($apiGroupsHeaders as $apiGroupsHeader) {
  63.             if (preg_match(self::API_GROUPS_REGEXP$apiGroupsHeader$matches)) {
  64.                 $parameters['serialization_groups'] = array_intersect($allowedSerializationGroupsarray_map('trim'explode(','$matches['groups'])));
  65.             }
  66.         }
  67.         return $parameters;
  68.     }
  69. }