X-Git-Url: http://www.aleph1.co.uk/gitweb/?p=yaffs-website;a=blobdiff_plain;f=vendor%2Fsymfony%2Fdependency-injection%2FContainer.php;fp=vendor%2Fsymfony%2Fdependency-injection%2FContainer.php;h=6e156919a1b392f16bdd532fe8b424be2f3a19db;hp=ea804c701bb0f82a4adf5a197584b99ae8218762;hb=9917807b03b64faf00f6a1f29dcb6eafc454efa5;hpb=aea91e65e895364e460983b890e295aa5d5540a5 diff --git a/vendor/symfony/dependency-injection/Container.php b/vendor/symfony/dependency-injection/Container.php index ea804c701..6e156919a 100644 --- a/vendor/symfony/dependency-injection/Container.php +++ b/vendor/symfony/dependency-injection/Container.php @@ -11,14 +11,12 @@ namespace Symfony\Component\DependencyInjection; -use Symfony\Component\DependencyInjection\Exception\InactiveScopeException; +use Symfony\Component\DependencyInjection\Exception\EnvNotFoundException; use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; -use Symfony\Component\DependencyInjection\Exception\LogicException; -use Symfony\Component\DependencyInjection\Exception\RuntimeException; use Symfony\Component\DependencyInjection\Exception\ServiceNotFoundException; use Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException; use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface; -use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag; +use Symfony\Component\DependencyInjection\ParameterBag\EnvPlaceholderParameterBag; use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag; /** @@ -30,16 +28,6 @@ use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag; * * Parameter and service keys are case insensitive. * - * A service id can contain lowercased letters, digits, underscores, and dots. - * Underscores are used to separate words, and dots to group services - * under namespaces: - * - * - * * A service can also be defined by creating a method named * getXXXService(), where XXX is the camelized version of the id: * @@ -59,7 +47,7 @@ use Symfony\Component\DependencyInjection\ParameterBag\FrozenParameterBag; * @author Fabien Potencier * @author Johannes M. Schmitt */ -class Container implements IntrospectableContainerInterface, ResettableContainerInterface +class Container implements ResettableContainerInterface { /** * @var ParameterBagInterface @@ -69,20 +57,22 @@ class Container implements IntrospectableContainerInterface, ResettableContainer protected $services = array(); protected $methodMap = array(); protected $aliases = array(); - protected $scopes = array(); - protected $scopeChildren = array(); - protected $scopedServices = array(); - protected $scopeStacks = array(); protected $loading = array(); + /** + * @internal + */ + protected $privates = array(); + private $underscoreMap = array('_' => '', '.' => '_', '\\' => '_'); + private $envCache = array(); /** * @param ParameterBagInterface $parameterBag A ParameterBagInterface instance */ public function __construct(ParameterBagInterface $parameterBag = null) { - $this->parameterBag = $parameterBag ?: new ParameterBag(); + $this->parameterBag = $parameterBag ?: new EnvPlaceholderParameterBag(); } /** @@ -163,39 +153,15 @@ class Container implements IntrospectableContainerInterface, ResettableContainer * Setting a service to null resets the service: has() returns false and get() * behaves in the same way as if the service was never created. * - * Note: The $scope parameter is deprecated since version 2.8 and will be removed in 3.0. - * * @param string $id The service identifier * @param object $service The service instance - * @param string $scope The scope of the service - * - * @throws RuntimeException When trying to set a service in an inactive scope - * @throws InvalidArgumentException When trying to set a service in the prototype scope */ - public function set($id, $service, $scope = self::SCOPE_CONTAINER) + public function set($id, $service) { - if (!in_array($scope, array('container', 'request')) || ('request' === $scope && 'request' !== $id)) { - @trigger_error('The concept of container scopes is deprecated since version 2.8 and will be removed in 3.0. Omit the third parameter.', E_USER_DEPRECATED); - } - - if (self::SCOPE_PROTOTYPE === $scope) { - throw new InvalidArgumentException(sprintf('You cannot set service "%s" of scope "prototype".', $id)); - } - $id = strtolower($id); if ('service_container' === $id) { - // BC: 'service_container' is no longer a self-reference but always - // $this, so ignore this call. - // @todo Throw InvalidArgumentException in next major release. - return; - } - if (self::SCOPE_CONTAINER !== $scope) { - if (!isset($this->scopedServices[$scope])) { - throw new RuntimeException(sprintf('You cannot set service "%s" of inactive scope.', $id)); - } - - $this->scopedServices[$scope][$id] = $service; + throw new InvalidArgumentException('You cannot set service "service_container".'); } if (isset($this->aliases[$id])) { @@ -204,16 +170,17 @@ class Container implements IntrospectableContainerInterface, ResettableContainer $this->services[$id] = $service; - if (method_exists($this, $method = 'synchronize'.strtr($id, $this->underscoreMap).'Service')) { - $this->$method(); + if (null === $service) { + unset($this->services[$id]); } - if (null === $service) { - if (self::SCOPE_CONTAINER !== $scope) { - unset($this->scopedServices[$scope][$id]); + if (isset($this->privates[$id])) { + if (null === $service) { + @trigger_error(sprintf('Unsetting the "%s" private service is deprecated since Symfony 3.2 and won\'t be supported anymore in Symfony 4.0.', $id), E_USER_DEPRECATED); + unset($this->privates[$id]); + } else { + @trigger_error(sprintf('Setting the "%s" private service is deprecated since Symfony 3.2 and won\'t be supported anymore in Symfony 4.0. A new public service will be created instead.', $id), E_USER_DEPRECATED); } - - unset($this->services[$id]); } } @@ -227,18 +194,35 @@ class Container implements IntrospectableContainerInterface, ResettableContainer public function has($id) { for ($i = 2;;) { + if (isset($this->privates[$id])) { + @trigger_error(sprintf('Checking for the existence of the "%s" private service is deprecated since Symfony 3.2 and won\'t be supported anymore in Symfony 4.0.', $id), E_USER_DEPRECATED); + } + if ('service_container' === $id || isset($this->aliases[$id]) || isset($this->services[$id]) - || array_key_exists($id, $this->services) ) { return true; } + + if (isset($this->methodMap[$id])) { + return true; + } + if (--$i && $id !== $lcId = strtolower($id)) { $id = $lcId; - } else { - return method_exists($this, 'get'.strtr($id, $this->underscoreMap).'Service'); + continue; } + + // We only check the convention-based factory in a compiled container (i.e. a child class other than a ContainerBuilder, + // and only when the dumper has not generated the method map (otherwise the method map is considered to be fully populated by the dumper) + if (!$this->methodMap && !$this instanceof ContainerBuilder && __CLASS__ !== static::class && method_exists($this, 'get'.strtr($id, $this->underscoreMap).'Service')) { + @trigger_error('Generating a dumped container without populating the method map is deprecated since 3.2 and will be unsupported in 4.0. Update your dumper to generate the method map.', E_USER_DEPRECATED); + + return true; + } + + return false; } } @@ -266,16 +250,20 @@ class Container implements IntrospectableContainerInterface, ResettableContainer // this method can be called thousands of times during a request, avoid // calling strtolower() unless necessary. for ($i = 2;;) { - if ('service_container' === $id) { - return $this; + if (isset($this->privates[$id])) { + @trigger_error(sprintf('Requesting the "%s" private service is deprecated since Symfony 3.2 and won\'t be supported anymore in Symfony 4.0.', $id), E_USER_DEPRECATED); } if (isset($this->aliases[$id])) { $id = $this->aliases[$id]; } + // Re-use shared service instance if it exists. - if (isset($this->services[$id]) || array_key_exists($id, $this->services)) { + if (isset($this->services[$id])) { return $this->services[$id]; } + if ('service_container' === $id) { + return $this; + } if (isset($this->loading[$id])) { throw new ServiceCircularReferenceException($id, array_keys($this->loading)); @@ -286,7 +274,10 @@ class Container implements IntrospectableContainerInterface, ResettableContainer } elseif (--$i && $id !== $lcId = strtolower($id)) { $id = $lcId; continue; - } elseif (method_exists($this, $method = 'get'.strtr($id, $this->underscoreMap).'Service')) { + } elseif (!$this->methodMap && !$this instanceof ContainerBuilder && __CLASS__ !== static::class && method_exists($this, $method = 'get'.strtr($id, $this->underscoreMap).'Service')) { + // We only check the convention-based factory in a compiled container (i.e. a child class other than a ContainerBuilder, + // and only when the dumper has not generated the method map (otherwise the method map is considered to be fully populated by the dumper) + @trigger_error('Generating a dumped container without populating the method map is deprecated since 3.2 and will be unsupported in 4.0. Update your dumper to generate the method map.', E_USER_DEPRECATED); // $method is set to the right value, proceed } else { if (self::EXCEPTION_ON_INVALID_REFERENCE === $invalidBehavior) { @@ -313,23 +304,13 @@ class Container implements IntrospectableContainerInterface, ResettableContainer try { $service = $this->$method(); } catch (\Exception $e) { - unset($this->loading[$id]); unset($this->services[$id]); - if ($e instanceof InactiveScopeException && self::EXCEPTION_ON_INVALID_REFERENCE !== $invalidBehavior) { - return; - } - throw $e; - } catch (\Throwable $e) { + } finally { unset($this->loading[$id]); - unset($this->services[$id]); - - throw $e; } - unset($this->loading[$id]); - return $service; } } @@ -345,17 +326,15 @@ class Container implements IntrospectableContainerInterface, ResettableContainer { $id = strtolower($id); - if ('service_container' === $id) { - // BC: 'service_container' was a synthetic service previously. - // @todo Change to false in next major release. - return true; - } - if (isset($this->aliases[$id])) { $id = $this->aliases[$id]; } - return isset($this->services[$id]) || array_key_exists($id, $this->services); + if ('service_container' === $id) { + return false; + } + + return isset($this->services[$id]); } /** @@ -363,10 +342,6 @@ class Container implements IntrospectableContainerInterface, ResettableContainer */ public function reset() { - if (!empty($this->scopedServices)) { - throw new LogicException('Resetting the container is not allowed when a scope is active.'); - } - $this->services = array(); } @@ -378,215 +353,72 @@ class Container implements IntrospectableContainerInterface, ResettableContainer public function getServiceIds() { $ids = array(); - foreach (get_class_methods($this) as $method) { - if (preg_match('/^get(.+)Service$/', $method, $match)) { - $ids[] = self::underscore($match[1]); + + if (!$this->methodMap && !$this instanceof ContainerBuilder && __CLASS__ !== static::class) { + // We only check the convention-based factory in a compiled container (i.e. a child class other than a ContainerBuilder, + // and only when the dumper has not generated the method map (otherwise the method map is considered to be fully populated by the dumper) + @trigger_error('Generating a dumped container without populating the method map is deprecated since 3.2 and will be unsupported in 4.0. Update your dumper to generate the method map.', E_USER_DEPRECATED); + + foreach (get_class_methods($this) as $method) { + if (preg_match('/^get(.+)Service$/', $method, $match)) { + $ids[] = self::underscore($match[1]); + } } } $ids[] = 'service_container'; - return array_unique(array_merge($ids, array_keys($this->services))); + return array_unique(array_merge($ids, array_keys($this->methodMap), array_keys($this->services))); } /** - * This is called when you enter a scope. - * - * @param string $name + * Camelizes a string. * - * @throws RuntimeException When the parent scope is inactive - * @throws InvalidArgumentException When the scope does not exist + * @param string $id A string to camelize * - * @deprecated since version 2.8, to be removed in 3.0. + * @return string The camelized string */ - public function enterScope($name) + public static function camelize($id) { - if ('request' !== $name) { - @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED); - } - - if (!isset($this->scopes[$name])) { - throw new InvalidArgumentException(sprintf('The scope "%s" does not exist.', $name)); - } - - if (self::SCOPE_CONTAINER !== $this->scopes[$name] && !isset($this->scopedServices[$this->scopes[$name]])) { - throw new RuntimeException(sprintf('The parent scope "%s" must be active when entering this scope.', $this->scopes[$name])); - } - - // check if a scope of this name is already active, if so we need to - // remove all services of this scope, and those of any of its child - // scopes from the global services map - if (isset($this->scopedServices[$name])) { - $services = array($this->services, $name => $this->scopedServices[$name]); - unset($this->scopedServices[$name]); - - foreach ($this->scopeChildren[$name] as $child) { - if (isset($this->scopedServices[$child])) { - $services[$child] = $this->scopedServices[$child]; - unset($this->scopedServices[$child]); - } - } - - // update global map - $this->services = call_user_func_array('array_diff_key', $services); - array_shift($services); - - // add stack entry for this scope so we can restore the removed services later - if (!isset($this->scopeStacks[$name])) { - $this->scopeStacks[$name] = new \SplStack(); - } - $this->scopeStacks[$name]->push($services); - } - - $this->scopedServices[$name] = array(); + return strtr(ucwords(strtr($id, array('_' => ' ', '.' => '_ ', '\\' => '_ '))), array(' ' => '')); } /** - * This is called to leave the current scope, and move back to the parent - * scope. - * - * @param string $name The name of the scope to leave + * A string to underscore. * - * @throws InvalidArgumentException if the scope is not active + * @param string $id The string to underscore * - * @deprecated since version 2.8, to be removed in 3.0. + * @return string The underscored string */ - public function leaveScope($name) + public static function underscore($id) { - if ('request' !== $name) { - @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED); - } - - if (!isset($this->scopedServices[$name])) { - throw new InvalidArgumentException(sprintf('The scope "%s" is not active.', $name)); - } - - // remove all services of this scope, or any of its child scopes from - // the global service map - $services = array($this->services, $this->scopedServices[$name]); - unset($this->scopedServices[$name]); - - foreach ($this->scopeChildren[$name] as $child) { - if (isset($this->scopedServices[$child])) { - $services[] = $this->scopedServices[$child]; - unset($this->scopedServices[$child]); - } - } - - // update global map - $this->services = call_user_func_array('array_diff_key', $services); - - // check if we need to restore services of a previous scope of this type - if (isset($this->scopeStacks[$name]) && count($this->scopeStacks[$name]) > 0) { - $services = $this->scopeStacks[$name]->pop(); - $this->scopedServices += $services; - - if ($this->scopeStacks[$name]->isEmpty()) { - unset($this->scopeStacks[$name]); - } - - foreach ($services as $array) { - foreach ($array as $id => $service) { - $this->set($id, $service, $name); - } - } - } + return strtolower(preg_replace(array('/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'), array('\\1_\\2', '\\1_\\2'), str_replace('_', '.', $id))); } /** - * Adds a scope to the container. + * Fetches a variable from the environment. * - * @param ScopeInterface $scope + * @param string The name of the environment variable * - * @throws InvalidArgumentException + * @return scalar The value to use for the provided environment variable name * - * @deprecated since version 2.8, to be removed in 3.0. + * @throws EnvNotFoundException When the environment variable is not found and has no default value */ - public function addScope(ScopeInterface $scope) + protected function getEnv($name) { - $name = $scope->getName(); - $parentScope = $scope->getParentName(); - - if ('request' !== $name) { - @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED); - } - if (self::SCOPE_CONTAINER === $name || self::SCOPE_PROTOTYPE === $name) { - throw new InvalidArgumentException(sprintf('The scope "%s" is reserved.', $name)); + if (isset($this->envCache[$name]) || array_key_exists($name, $this->envCache)) { + return $this->envCache[$name]; } - if (isset($this->scopes[$name])) { - throw new InvalidArgumentException(sprintf('A scope with name "%s" already exists.', $name)); + if (isset($_ENV[$name])) { + return $this->envCache[$name] = $_ENV[$name]; } - if (self::SCOPE_CONTAINER !== $parentScope && !isset($this->scopes[$parentScope])) { - throw new InvalidArgumentException(sprintf('The parent scope "%s" does not exist, or is invalid.', $parentScope)); + if (false !== $env = getenv($name)) { + return $this->envCache[$name] = $env; } - - $this->scopes[$name] = $parentScope; - $this->scopeChildren[$name] = array(); - - // normalize the child relations - while ($parentScope !== self::SCOPE_CONTAINER) { - $this->scopeChildren[$parentScope][] = $name; - $parentScope = $this->scopes[$parentScope]; + if (!$this->hasParameter("env($name)")) { + throw new EnvNotFoundException($name); } - } - /** - * Returns whether this container has a certain scope. - * - * @param string $name The name of the scope - * - * @return bool - * - * @deprecated since version 2.8, to be removed in 3.0. - */ - public function hasScope($name) - { - if ('request' !== $name) { - @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED); - } - - return isset($this->scopes[$name]); - } - - /** - * Returns whether this scope is currently active. - * - * This does not actually check if the passed scope actually exists. - * - * @param string $name - * - * @return bool - * - * @deprecated since version 2.8, to be removed in 3.0. - */ - public function isScopeActive($name) - { - @trigger_error('The '.__METHOD__.' method is deprecated since version 2.8 and will be removed in 3.0.', E_USER_DEPRECATED); - - return isset($this->scopedServices[$name]); - } - - /** - * Camelizes a string. - * - * @param string $id A string to camelize - * - * @return string The camelized string - */ - public static function camelize($id) - { - return strtr(ucwords(strtr($id, array('_' => ' ', '.' => '_ ', '\\' => '_ '))), array(' ' => '')); - } - - /** - * A string to underscore. - * - * @param string $id The string to underscore - * - * @return string The underscored string - */ - public static function underscore($id) - { - return strtolower(preg_replace(array('/([A-Z]+)([A-Z][a-z])/', '/([a-z\d])([A-Z])/'), array('\\1_\\2', '\\1_\\2'), str_replace('_', '.', $id))); + return $this->envCache[$name] = $this->getParameter("env($name)"); } private function __clone()