vendor/sensio/framework-extra-bundle/Request/ParamConverter/ParamConverterManager.php line 48

Open in your IDE?
  1. <?php
  2. /*
  3.  * This file is part of the Symfony package.
  4.  *
  5.  * (c) Fabien Potencier <fabien@symfony.com>
  6.  *
  7.  * For the full copyright and license information, please view the LICENSE
  8.  * file that was distributed with this source code.
  9.  */
  10. namespace Sensio\Bundle\FrameworkExtraBundle\Request\ParamConverter;
  11. use Sensio\Bundle\FrameworkExtraBundle\Configuration\ParamConverter;
  12. use Symfony\Component\HttpFoundation\Request;
  13. /**
  14.  * Managers converters.
  15.  *
  16.  * @author Fabien Potencier <fabien@symfony.com>
  17.  * @author Henrik Bjornskov <henrik@bjrnskov.dk>
  18.  */
  19. class ParamConverterManager
  20. {
  21.     /**
  22.      * @var array
  23.      */
  24.     private $converters = [];
  25.     /**
  26.      * @var array
  27.      */
  28.     private $namedConverters = [];
  29.     /**
  30.      * Applies all converters to the passed configurations and stops when a
  31.      * converter is applied it will move on to the next configuration and so on.
  32.      *
  33.      * @param array|object $configurations
  34.      */
  35.     public function apply(Request $request$configurations)
  36.     {
  37.         if (\is_object($configurations)) {
  38.             $configurations = [$configurations];
  39.         }
  40.         foreach ($configurations as $configuration) {
  41.             $this->applyConverter($request$configuration);
  42.         }
  43.     }
  44.     /**
  45.      * Applies converter on request based on the given configuration.
  46.      */
  47.     private function applyConverter(Request $requestParamConverter $configuration)
  48.     {
  49.         $value $request->attributes->get($configuration->getName());
  50.         $className $configuration->getClass();
  51.         // If the value is already an instance of the class we are trying to convert it into
  52.         // we should continue as no conversion is required
  53.         if (\is_object($value) && $value instanceof $className) {
  54.             return;
  55.         }
  56.         if ($converterName $configuration->getConverter()) {
  57.             if (!isset($this->namedConverters[$converterName])) {
  58.                 throw new \RuntimeException(sprintf(
  59.                     "No converter named '%s' found for conversion of parameter '%s'.",
  60.                     $converterName,
  61.                     $configuration->getName()
  62.                 ));
  63.             }
  64.             $converter $this->namedConverters[$converterName];
  65.             if (!$converter->supports($configuration)) {
  66.                 throw new \RuntimeException(sprintf(
  67.                     "Converter '%s' does not support conversion of parameter '%s'.",
  68.                     $converterName,
  69.                     $configuration->getName()
  70.                 ));
  71.             }
  72.             $converter->apply($request$configuration);
  73.             return;
  74.         }
  75.         foreach ($this->all() as $converter) {
  76.             if ($converter->supports($configuration)) {
  77.                 if ($converter->apply($request$configuration)) {
  78.                     return;
  79.                 }
  80.             }
  81.         }
  82.     }
  83.     /**
  84.      * Adds a parameter converter.
  85.      *
  86.      * Converters match either explicitly via $name or by iteration over all
  87.      * converters with a $priority. If you pass a $priority = null then the
  88.      * added converter will not be part of the iteration chain and can only
  89.      * be invoked explicitly.
  90.      *
  91.      * @param int    $priority the priority (between -10 and 10)
  92.      * @param string $name     name of the converter
  93.      */
  94.     public function add(ParamConverterInterface $converter$priority 0$name null)
  95.     {
  96.         if (null !== $priority) {
  97.             if (!isset($this->converters[$priority])) {
  98.                 $this->converters[$priority] = [];
  99.             }
  100.             $this->converters[$priority][] = $converter;
  101.         }
  102.         if (null !== $name) {
  103.             $this->namedConverters[$name] = $converter;
  104.         }
  105.     }
  106.     /**
  107.      * Returns all registered param converters.
  108.      *
  109.      * @return array An array of param converters
  110.      */
  111.     public function all()
  112.     {
  113.         krsort($this->converters);
  114.         $converters = [];
  115.         foreach ($this->converters as $all) {
  116.             $converters array_merge($converters$all);
  117.         }
  118.         return $converters;
  119.     }
  120. }