Seditio Source
Root |
./othercms/phpBB3/vendor/symfony/dependency-injection/ParameterBag/ParameterBag.php
<?php

/*
 * This file is part of the Symfony package.
 *
 * (c) Fabien Potencier <fabien@symfony.com>
 *
 * For the full copyright and license information, please view the LICENSE
 * file that was distributed with this source code.
 */

namespace Symfony\Component\DependencyInjection\ParameterBag;

use
Symfony\Component\DependencyInjection\Exception\ParameterCircularReferenceException;
use
Symfony\Component\DependencyInjection\Exception\ParameterNotFoundException;
use
Symfony\Component\DependencyInjection\Exception\RuntimeException;

/**
 * Holds parameters.
 *
 * @author Fabien Potencier <fabien@symfony.com>
 */
class ParameterBag implements ParameterBagInterface
{
    protected
$parameters = [];
    protected
$resolved = false;

    private
$normalizedNames = [];

   
/**
     * @param array $parameters An array of parameters
     */
   
public function __construct(array $parameters = [])
    {
       
$this->add($parameters);
    }

   
/**
     * Clears all parameters.
     */
   
public function clear()
    {
       
$this->parameters = [];
    }

   
/**
     * Adds parameters to the service container parameters.
     *
     * @param array $parameters An array of parameters
     */
   
public function add(array $parameters)
    {
        foreach (
$parameters as $key => $value) {
           
$this->set($key, $value);
        }
    }

   
/**
     * {@inheritdoc}
     */
   
public function all()
    {
        return
$this->parameters;
    }

   
/**
     * {@inheritdoc}
     */
   
public function get($name)
    {
       
$name = $this->normalizeName($name);

        if (!\
array_key_exists($name, $this->parameters)) {
            if (!
$name) {
                throw new
ParameterNotFoundException($name);
            }

           
$alternatives = [];
            foreach (
$this->parameters as $key => $parameterValue) {
               
$lev = levenshtein($name, $key);
                if (
$lev <= \strlen($name) / 3 || false !== strpos($key, $name)) {
                   
$alternatives[] = $key;
                }
            }

           
$nonNestedAlternative = null;
            if (!\
count($alternatives) && false !== strpos($name, '.')) {
               
$namePartsLength = array_map('strlen', explode('.', $name));
               
$key = substr($name, 0, -1 * (1 + array_pop($namePartsLength)));
                while (\
count($namePartsLength)) {
                    if (
$this->has($key)) {
                        if (\
is_array($this->get($key))) {
                           
$nonNestedAlternative = $key;
                        }
                        break;
                    }

                   
$key = substr($key, 0, -1 * (1 + array_pop($namePartsLength)));
                }
            }

            throw new
ParameterNotFoundException($name, null, null, null, $alternatives, $nonNestedAlternative);
        }

        return
$this->parameters[$name];
    }

   
/**
     * Sets a service container parameter.
     *
     * @param string $name  The parameter name
     * @param mixed  $value The parameter value
     */
   
public function set($name, $value)
    {
       
$this->parameters[$this->normalizeName($name)] = $value;
    }

   
/**
     * {@inheritdoc}
     */
   
public function has($name)
    {
        return \
array_key_exists($this->normalizeName($name), $this->parameters);
    }

   
/**
     * Removes a parameter.
     *
     * @param string $name The parameter name
     */
   
public function remove($name)
    {
        unset(
$this->parameters[$this->normalizeName($name)]);
    }

   
/**
     * {@inheritdoc}
     */
   
public function resolve()
    {
        if (
$this->resolved) {
            return;
        }

       
$parameters = [];
        foreach (
$this->parameters as $key => $value) {
            try {
               
$value = $this->resolveValue($value);
               
$parameters[$key] = $this->unescapeValue($value);
            } catch (
ParameterNotFoundException $e) {
               
$e->setSourceKey($key);

                throw
$e;
            }
        }

       
$this->parameters = $parameters;
       
$this->resolved = true;
    }

   
/**
     * Replaces parameter placeholders (%name%) by their values.
     *
     * @param mixed $value     A value
     * @param array $resolving An array of keys that are being resolved (used internally to detect circular references)
     *
     * @return mixed The resolved value
     *
     * @throws ParameterNotFoundException          if a placeholder references a parameter that does not exist
     * @throws ParameterCircularReferenceException if a circular reference if detected
     * @throws RuntimeException                    when a given parameter has a type problem
     */
   
public function resolveValue($value, array $resolving = [])
    {
        if (\
is_array($value)) {
           
$args = [];
            foreach (
$value as $k => $v) {
               
$args[\is_string($k) ? $this->resolveValue($k, $resolving) : $k] = $this->resolveValue($v, $resolving);
            }

            return
$args;
        }

        if (!\
is_string($value) || 2 > \strlen($value)) {
            return
$value;
        }

        return
$this->resolveString($value, $resolving);
    }

   
/**
     * Resolves parameters inside a string.
     *
     * @param string $value     The string to resolve
     * @param array  $resolving An array of keys that are being resolved (used internally to detect circular references)
     *
     * @return mixed The resolved string
     *
     * @throws ParameterNotFoundException          if a placeholder references a parameter that does not exist
     * @throws ParameterCircularReferenceException if a circular reference if detected
     * @throws RuntimeException                    when a given parameter has a type problem
     */
   
public function resolveString($value, array $resolving = [])
    {
       
// we do this to deal with non string values (Boolean, integer, ...)
        // as the preg_replace_callback throw an exception when trying
        // a non-string in a parameter value
       
if (preg_match('/^%([^%\s]+)%$/', $value, $match)) {
           
$key = $match[1];
           
$lcKey = strtolower($key); // strtolower() to be removed in 4.0

           
if (isset($resolving[$lcKey])) {
                throw new
ParameterCircularReferenceException(array_keys($resolving));
            }

           
$resolving[$lcKey] = true;

            return
$this->resolved ? $this->get($key) : $this->resolveValue($this->get($key), $resolving);
        }

        return
preg_replace_callback('/%%|%([^%\s]+)%/', function ($match) use ($resolving, $value) {
           
// skip %%
           
if (!isset($match[1])) {
                return
'%%';
            }

           
$key = $match[1];
           
$lcKey = strtolower($key); // strtolower() to be removed in 4.0
           
if (isset($resolving[$lcKey])) {
                throw new
ParameterCircularReferenceException(array_keys($resolving));
            }

           
$resolved = $this->get($key);

            if (!\
is_string($resolved) && !is_numeric($resolved)) {
                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));
            }

           
$resolved = (string) $resolved;
           
$resolving[$lcKey] = true;

            return
$this->isResolved() ? $resolved : $this->resolveString($resolved, $resolving);
        },
$value);
    }

    public function
isResolved()
    {
        return
$this->resolved;
    }

   
/**
     * {@inheritdoc}
     */
   
public function escapeValue($value)
    {
        if (\
is_string($value)) {
            return
str_replace('%', '%%', $value);
        }

        if (\
is_array($value)) {
           
$result = [];
            foreach (
$value as $k => $v) {
               
$result[$k] = $this->escapeValue($v);
            }

            return
$result;
        }

        return
$value;
    }

   
/**
     * {@inheritdoc}
     */
   
public function unescapeValue($value)
    {
        if (\
is_string($value)) {
            return
str_replace('%%', '%', $value);
        }

        if (\
is_array($value)) {
           
$result = [];
            foreach (
$value as $k => $v) {
               
$result[$k] = $this->unescapeValue($v);
            }

            return
$result;
        }

        return
$value;
    }

    private function
normalizeName($name)
    {
        if (isset(
$this->normalizedNames[$normalizedName = strtolower($name)])) {
           
$normalizedName = $this->normalizedNames[$normalizedName];
            if ((string)
$name !== $normalizedName) {
                @
trigger_error(sprintf('Parameter names will be made case sensitive in Symfony 4.0. Using "%s" instead of "%s" is deprecated since Symfony 3.4.', $name, $normalizedName), \E_USER_DEPRECATED);
            }
        } else {
           
$normalizedName = $this->normalizedNames[$normalizedName] = (string) $name;
        }

        return
$normalizedName;
    }
}