vendor/symfony/dependency-injection/ParameterBag/ParameterBag.php line 206

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 Symfony\Component\DependencyInjection\ParameterBag;
  11. use Symfony\Component\DependencyInjection\Exception\ParameterCircularReferenceException;
  12. use Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
  13. use Symfony\Component\DependencyInjection\Exception\RuntimeException;
  14. /**
  15.  * Holds parameters.
  16.  *
  17.  * @author Fabien Potencier <fabien@symfony.com>
  18.  */
  19. class ParameterBag implements ParameterBagInterface
  20. {
  21.     protected $parameters = [];
  22.     protected $resolved false;
  23.     public function __construct(array $parameters = [])
  24.     {
  25.         $this->add($parameters);
  26.     }
  27.     /**
  28.      * {@inheritdoc}
  29.      */
  30.     public function clear()
  31.     {
  32.         $this->parameters = [];
  33.     }
  34.     /**
  35.      * {@inheritdoc}
  36.      */
  37.     public function add(array $parameters)
  38.     {
  39.         foreach ($parameters as $key => $value) {
  40.             $this->set($key$value);
  41.         }
  42.     }
  43.     /**
  44.      * {@inheritdoc}
  45.      */
  46.     public function all()
  47.     {
  48.         return $this->parameters;
  49.     }
  50.     /**
  51.      * {@inheritdoc}
  52.      */
  53.     public function get($name)
  54.     {
  55.         $name = (string) $name;
  56.         if (!\array_key_exists($name$this->parameters)) {
  57.             if (!$name) {
  58.                 throw new ParameterNotFoundException($name);
  59.             }
  60.             $alternatives = [];
  61.             foreach ($this->parameters as $key => $parameterValue) {
  62.                 $lev levenshtein($name$key);
  63.                 if ($lev <= \strlen($name) / || str_contains($key$name)) {
  64.                     $alternatives[] = $key;
  65.                 }
  66.             }
  67.             $nonNestedAlternative null;
  68.             if (!\count($alternatives) && str_contains($name'.')) {
  69.                 $namePartsLength array_map('strlen'explode('.'$name));
  70.                 $key substr($name0, -* (array_pop($namePartsLength)));
  71.                 while (\count($namePartsLength)) {
  72.                     if ($this->has($key)) {
  73.                         if (\is_array($this->get($key))) {
  74.                             $nonNestedAlternative $key;
  75.                         }
  76.                         break;
  77.                     }
  78.                     $key substr($key0, -* (array_pop($namePartsLength)));
  79.                 }
  80.             }
  81.             throw new ParameterNotFoundException($namenullnullnull$alternatives$nonNestedAlternative);
  82.         }
  83.         return $this->parameters[$name];
  84.     }
  85.     /**
  86.      * {@inheritdoc}
  87.      */
  88.     public function set($name$value)
  89.     {
  90.         $this->parameters[(string) $name] = $value;
  91.     }
  92.     /**
  93.      * {@inheritdoc}
  94.      */
  95.     public function has($name)
  96.     {
  97.         return \array_key_exists((string) $name$this->parameters);
  98.     }
  99.     /**
  100.      * {@inheritdoc}
  101.      */
  102.     public function remove($name)
  103.     {
  104.         unset($this->parameters[(string) $name]);
  105.     }
  106.     /**
  107.      * {@inheritdoc}
  108.      */
  109.     public function resolve()
  110.     {
  111.         if ($this->resolved) {
  112.             return;
  113.         }
  114.         $parameters = [];
  115.         foreach ($this->parameters as $key => $value) {
  116.             try {
  117.                 $value $this->resolveValue($value);
  118.                 $parameters[$key] = $this->unescapeValue($value);
  119.             } catch (ParameterNotFoundException $e) {
  120.                 $e->setSourceKey($key);
  121.                 throw $e;
  122.             }
  123.         }
  124.         $this->parameters $parameters;
  125.         $this->resolved true;
  126.     }
  127.     /**
  128.      * Replaces parameter placeholders (%name%) by their values.
  129.      *
  130.      * @param mixed $value     A value
  131.      * @param array $resolving An array of keys that are being resolved (used internally to detect circular references)
  132.      *
  133.      * @return mixed The resolved value
  134.      *
  135.      * @throws ParameterNotFoundException          if a placeholder references a parameter that does not exist
  136.      * @throws ParameterCircularReferenceException if a circular reference if detected
  137.      * @throws RuntimeException                    when a given parameter has a type problem
  138.      */
  139.     public function resolveValue($value, array $resolving = [])
  140.     {
  141.         if (\is_array($value)) {
  142.             $args = [];
  143.             foreach ($value as $k => $v) {
  144.                 $args[\is_string($k) ? $this->resolveValue($k$resolving) : $k] = $this->resolveValue($v$resolving);
  145.             }
  146.             return $args;
  147.         }
  148.         if (!\is_string($value) || > \strlen($value)) {
  149.             return $value;
  150.         }
  151.         return $this->resolveString($value$resolving);
  152.     }
  153.     /**
  154.      * Resolves parameters inside a string.
  155.      *
  156.      * @param string $value     The string to resolve
  157.      * @param array  $resolving An array of keys that are being resolved (used internally to detect circular references)
  158.      *
  159.      * @return mixed The resolved string
  160.      *
  161.      * @throws ParameterNotFoundException          if a placeholder references a parameter that does not exist
  162.      * @throws ParameterCircularReferenceException if a circular reference if detected
  163.      * @throws RuntimeException                    when a given parameter has a type problem
  164.      */
  165.     public function resolveString($value, array $resolving = [])
  166.     {
  167.         // we do this to deal with non string values (Boolean, integer, ...)
  168.         // as the preg_replace_callback throw an exception when trying
  169.         // a non-string in a parameter value
  170.         if (preg_match('/^%([^%\s]+)%$/'$value$match)) {
  171.             $key $match[1];
  172.             if (isset($resolving[$key])) {
  173.                 throw new ParameterCircularReferenceException(array_keys($resolving));
  174.             }
  175.             $resolving[$key] = true;
  176.             return $this->resolved $this->get($key) : $this->resolveValue($this->get($key), $resolving);
  177.         }
  178.         return preg_replace_callback('/%%|%([^%\s]+)%/', function ($match) use ($resolving$value) {
  179.             // skip %%
  180.             if (!isset($match[1])) {
  181.                 return '%%';
  182.             }
  183.             $key $match[1];
  184.             if (isset($resolving[$key])) {
  185.                 throw new ParameterCircularReferenceException(array_keys($resolving));
  186.             }
  187.             $resolved $this->get($key);
  188.             if (!\is_string($resolved) && !is_numeric($resolved)) {
  189.                 throw new RuntimeException(sprintf('A string value must be composed of strings and/or numbers, but found parameter "%s" of type "%s" inside string value "%s".'$key, \gettype($resolved), $value));
  190.             }
  191.             $resolved = (string) $resolved;
  192.             $resolving[$key] = true;
  193.             return $this->isResolved() ? $resolved $this->resolveString($resolved$resolving);
  194.         }, $value);
  195.     }
  196.     public function isResolved()
  197.     {
  198.         return $this->resolved;
  199.     }
  200.     /**
  201.      * {@inheritdoc}
  202.      */
  203.     public function escapeValue($value)
  204.     {
  205.         if (\is_string($value)) {
  206.             return str_replace('%''%%'$value);
  207.         }
  208.         if (\is_array($value)) {
  209.             $result = [];
  210.             foreach ($value as $k => $v) {
  211.                 $result[$k] = $this->escapeValue($v);
  212.             }
  213.             return $result;
  214.         }
  215.         return $value;
  216.     }
  217.     /**
  218.      * {@inheritdoc}
  219.      */
  220.     public function unescapeValue($value)
  221.     {
  222.         if (\is_string($value)) {
  223.             return str_replace('%%''%'$value);
  224.         }
  225.         if (\is_array($value)) {
  226.             $result = [];
  227.             foreach ($value as $k => $v) {
  228.                 $result[$k] = $this->unescapeValue($v);
  229.             }
  230.             return $result;
  231.         }
  232.         return $value;
  233.     }
  234. }