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

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