X-Git-Url: https://yaffs.net/gitweb/?a=blobdiff_plain;f=vendor%2Fsymfony%2Fdependency-injection%2FLoader%2FXmlFileLoader.php;h=4236b72f252a61a40a55541bc4799e492209187f;hb=1c1cb0980bfa6caf0c24cce671b6bb541dc87583;hp=d0009c334295428542400f04c4a7f8ccd555fdb1;hpb=9917807b03b64faf00f6a1f29dcb6eafc454efa5;p=yaffs-website diff --git a/vendor/symfony/dependency-injection/Loader/XmlFileLoader.php b/vendor/symfony/dependency-injection/Loader/XmlFileLoader.php index d0009c334..4236b72f2 100644 --- a/vendor/symfony/dependency-injection/Loader/XmlFileLoader.php +++ b/vendor/symfony/dependency-injection/Loader/XmlFileLoader.php @@ -11,15 +11,18 @@ namespace Symfony\Component\DependencyInjection\Loader; -use Symfony\Component\Config\Resource\FileResource; use Symfony\Component\Config\Util\XmlUtils; -use Symfony\Component\DependencyInjection\DefinitionDecorator; -use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\Alias; +use Symfony\Component\DependencyInjection\Argument\BoundArgument; +use Symfony\Component\DependencyInjection\Argument\IteratorArgument; +use Symfony\Component\DependencyInjection\Argument\TaggedIteratorArgument; +use Symfony\Component\DependencyInjection\ChildDefinition; +use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\ContainerInterface; use Symfony\Component\DependencyInjection\Definition; -use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\DependencyInjection\Exception\InvalidArgumentException; use Symfony\Component\DependencyInjection\Exception\RuntimeException; +use Symfony\Component\DependencyInjection\Reference; use Symfony\Component\ExpressionLanguage\Expression; /** @@ -40,22 +43,28 @@ class XmlFileLoader extends FileLoader $xml = $this->parseFileToDOM($path); - $this->container->addResource(new FileResource($path)); + $this->container->fileExists($path); + + $defaults = $this->getServiceDefaults($xml, $path); // anonymous services - $this->processAnonymousServices($xml, $path); + $this->processAnonymousServices($xml, $path, $defaults); // imports $this->parseImports($xml, $path); // parameters - $this->parseParameters($xml); + $this->parseParameters($xml, $path); // extensions $this->loadFromExtensions($xml); // services - $this->parseDefinitions($xml, $path); + try { + $this->parseDefinitions($xml, $path, $defaults); + } finally { + $this->instanceof = array(); + } } /** @@ -63,18 +72,27 @@ class XmlFileLoader extends FileLoader */ public function supports($resource, $type = null) { - return is_string($resource) && 'xml' === pathinfo($resource, PATHINFO_EXTENSION); + if (!\is_string($resource)) { + return false; + } + + if (null === $type && 'xml' === pathinfo($resource, PATHINFO_EXTENSION)) { + return true; + } + + return 'xml' === $type; } /** * Parses parameters. * * @param \DOMDocument $xml + * @param string $file */ - private function parseParameters(\DOMDocument $xml) + private function parseParameters(\DOMDocument $xml, $file) { if ($parameters = $this->getChildren($xml->documentElement, 'parameters')) { - $this->container->getParameterBag()->add($this->getArgumentsAsPhp($parameters[0], 'parameter')); + $this->container->getParameterBag()->add($this->getArgumentsAsPhp($parameters[0], 'parameter', $file)); } } @@ -93,10 +111,10 @@ class XmlFileLoader extends FileLoader return; } - $defaultDirectory = dirname($file); + $defaultDirectory = \dirname($file); foreach ($imports as $import) { $this->setCurrentDir($defaultDirectory); - $this->import($import->getAttribute('resource'), null, (bool) XmlUtils::phpize($import->getAttribute('ignore-errors')), $file); + $this->import($import->getAttribute('resource'), XmlUtils::phpize($import->getAttribute('type')) ?: null, (bool) XmlUtils::phpize($import->getAttribute('ignore-errors')), $file); } } @@ -106,20 +124,70 @@ class XmlFileLoader extends FileLoader * @param \DOMDocument $xml * @param string $file */ - private function parseDefinitions(\DOMDocument $xml, $file) + private function parseDefinitions(\DOMDocument $xml, $file, $defaults) { $xpath = new \DOMXPath($xml); $xpath->registerNamespace('container', self::NS); - if (false === $services = $xpath->query('//container:services/container:service')) { + if (false === $services = $xpath->query('//container:services/container:service|//container:services/container:prototype')) { return; } + $this->setCurrentDir(\dirname($file)); + $this->instanceof = array(); + $this->isLoadingInstanceof = true; + $instanceof = $xpath->query('//container:services/container:instanceof'); + foreach ($instanceof as $service) { + $this->setDefinition((string) $service->getAttribute('id'), $this->parseDefinition($service, $file, array())); + } + + $this->isLoadingInstanceof = false; foreach ($services as $service) { - if (null !== $definition = $this->parseDefinition($service, $file)) { - $this->container->setDefinition((string) $service->getAttribute('id'), $definition); + if (null !== $definition = $this->parseDefinition($service, $file, $defaults)) { + if ('prototype' === $service->tagName) { + $this->registerClasses($definition, (string) $service->getAttribute('namespace'), (string) $service->getAttribute('resource'), (string) $service->getAttribute('exclude')); + } else { + $this->setDefinition((string) $service->getAttribute('id'), $definition); + } + } + } + } + + /** + * Get service defaults. + * + * @return array + */ + private function getServiceDefaults(\DOMDocument $xml, $file) + { + $xpath = new \DOMXPath($xml); + $xpath->registerNamespace('container', self::NS); + + if (null === $defaultsNode = $xpath->query('//container:services/container:defaults')->item(0)) { + return array(); + } + $defaults = array( + 'tags' => $this->getChildren($defaultsNode, 'tag'), + 'bind' => array_map(function ($v) { return new BoundArgument($v); }, $this->getArgumentsAsPhp($defaultsNode, 'bind', $file)), + ); + + foreach ($defaults['tags'] as $tag) { + if ('' === $tag->getAttribute('name')) { + throw new InvalidArgumentException(sprintf('The tag name for tag "" in %s must be a non-empty string.', $file)); } } + + if ($defaultsNode->hasAttribute('autowire')) { + $defaults['autowire'] = XmlUtils::phpize($defaultsNode->getAttribute('autowire')); + } + if ($defaultsNode->hasAttribute('public')) { + $defaults['public'] = XmlUtils::phpize($defaultsNode->getAttribute('public')); + } + if ($defaultsNode->hasAttribute('autoconfigure')) { + $defaults['autoconfigure'] = XmlUtils::phpize($defaultsNode->getAttribute('autoconfigure')); + } + + return $defaults; } /** @@ -127,30 +195,68 @@ class XmlFileLoader extends FileLoader * * @param \DOMElement $service * @param string $file + * @param array $defaults * * @return Definition|null */ - private function parseDefinition(\DOMElement $service, $file) + private function parseDefinition(\DOMElement $service, $file, array $defaults) { if ($alias = $service->getAttribute('alias')) { $this->validateAlias($service, $file); - $public = true; + $this->container->setAlias((string) $service->getAttribute('id'), $alias = new Alias($alias)); if ($publicAttr = $service->getAttribute('public')) { - $public = XmlUtils::phpize($publicAttr); + $alias->setPublic(XmlUtils::phpize($publicAttr)); + } elseif (isset($defaults['public'])) { + $alias->setPublic($defaults['public']); } - $this->container->setAlias((string) $service->getAttribute('id'), new Alias($alias, $public)); return; } - if ($parent = $service->getAttribute('parent')) { - $definition = new DefinitionDecorator($parent); + if ($this->isLoadingInstanceof) { + $definition = new ChildDefinition(''); + } elseif ($parent = $service->getAttribute('parent')) { + if (!empty($this->instanceof)) { + throw new InvalidArgumentException(sprintf('The service "%s" cannot use the "parent" option in the same file where "instanceof" configuration is defined as using both is not supported. Move your child definitions to a separate file.', $service->getAttribute('id'))); + } + + foreach ($defaults as $k => $v) { + if ('tags' === $k) { + // since tags are never inherited from parents, there is no confusion + // thus we can safely add them as defaults to ChildDefinition + continue; + } + if ('bind' === $k) { + if ($defaults['bind']) { + throw new InvalidArgumentException(sprintf('Bound values on service "%s" cannot be inherited from "defaults" when a "parent" is set. Move your child definitions to a separate file.', $service->getAttribute('id'))); + } + + continue; + } + if (!$service->hasAttribute($k)) { + throw new InvalidArgumentException(sprintf('Attribute "%s" on service "%s" cannot be inherited from "defaults" when a "parent" is set. Move your child definitions to a separate file or define this attribute explicitly.', $k, $service->getAttribute('id'))); + } + } + + $definition = new ChildDefinition($parent); } else { $definition = new Definition(); + + if (isset($defaults['public'])) { + $definition->setPublic($defaults['public']); + } + if (isset($defaults['autowire'])) { + $definition->setAutowired($defaults['autowire']); + } + if (isset($defaults['autoconfigure'])) { + $definition->setAutoconfigured($defaults['autoconfigure']); + } + + $definition->setChanges(array()); } - foreach (array('class', 'shared', 'public', 'synthetic', 'lazy', 'abstract') as $key) { + foreach (array('class', 'public', 'shared', 'synthetic', 'lazy', 'abstract') as $key) { if ($value = $service->getAttribute($key)) { $method = 'set'.$key; $definition->$method(XmlUtils::phpize($value)); @@ -161,6 +267,14 @@ class XmlFileLoader extends FileLoader $definition->setAutowired(XmlUtils::phpize($value)); } + if ($value = $service->getAttribute('autoconfigure')) { + if (!$definition instanceof ChildDefinition) { + $definition->setAutoconfigured(XmlUtils::phpize($value)); + } elseif ($value = XmlUtils::phpize($value)) { + throw new InvalidArgumentException(sprintf('The service "%s" cannot have a "parent" and also have "autoconfigure". Try setting autoconfigure="false" for the service.', $service->getAttribute('id'))); + } + } + if ($files = $this->getChildren($service, 'file')) { $definition->setFile($files[0]->nodeValue); } @@ -169,22 +283,18 @@ class XmlFileLoader extends FileLoader $definition->setDeprecated(true, $deprecated[0]->nodeValue ?: null); } - $definition->setArguments($this->getArgumentsAsPhp($service, 'argument')); - $definition->setProperties($this->getArgumentsAsPhp($service, 'property')); + $definition->setArguments($this->getArgumentsAsPhp($service, 'argument', $file, false, $definition instanceof ChildDefinition)); + $definition->setProperties($this->getArgumentsAsPhp($service, 'property', $file)); if ($factories = $this->getChildren($service, 'factory')) { $factory = $factories[0]; if ($function = $factory->getAttribute('function')) { $definition->setFactory($function); } else { - $factoryService = $this->getChildren($factory, 'service'); - - if (isset($factoryService[0])) { - $class = $this->parseDefinition($factoryService[0], $file); - } elseif ($childService = $factory->getAttribute('service')) { + if ($childService = $factory->getAttribute('service')) { $class = new Reference($childService, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE); } else { - $class = $factory->getAttribute('class'); + $class = $factory->hasAttribute('class') ? $factory->getAttribute('class') : null; } $definition->setFactory(array($class, $factory->getAttribute('method'))); @@ -196,11 +306,7 @@ class XmlFileLoader extends FileLoader if ($function = $configurator->getAttribute('function')) { $definition->setConfigurator($function); } else { - $configuratorService = $this->getChildren($configurator, 'service'); - - if (isset($configuratorService[0])) { - $class = $this->parseDefinition($configuratorService[0], $file); - } elseif ($childService = $configurator->getAttribute('service')) { + if ($childService = $configurator->getAttribute('service')) { $class = new Reference($childService, ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE); } else { $class = $configurator->getAttribute('class'); @@ -211,10 +317,16 @@ class XmlFileLoader extends FileLoader } foreach ($this->getChildren($service, 'call') as $call) { - $definition->addMethodCall($call->getAttribute('method'), $this->getArgumentsAsPhp($call, 'argument')); + $definition->addMethodCall($call->getAttribute('method'), $this->getArgumentsAsPhp($call, 'argument', $file)); + } + + $tags = $this->getChildren($service, 'tag'); + + if (!empty($defaults['tags'])) { + $tags = array_merge($tags, $defaults['tags']); } - foreach ($this->getChildren($service, 'tag') as $tag) { + foreach ($tags as $tag) { $parameters = array(); foreach ($tag->attributes as $name => $node) { if ('name' === $name) { @@ -239,6 +351,15 @@ class XmlFileLoader extends FileLoader $definition->addAutowiringType($type->textContent); } + $bindings = $this->getArgumentsAsPhp($service, 'bind', $file); + if (isset($defaults['bind'])) { + // deep clone, to avoid multiple process of the same instance in the passes + $bindings = array_merge(unserialize(serialize($defaults['bind'])), $bindings); + } + if ($bindings) { + $definition->setBindings($bindings); + } + if ($value = $service->getAttribute('decorates')) { $renameId = $service->hasAttribute('decoration-inner-name') ? $service->getAttribute('decoration-inner-name') : null; $priority = $service->hasAttribute('decoration-priority') ? $service->getAttribute('decoration-priority') : 0; @@ -275,23 +396,26 @@ class XmlFileLoader extends FileLoader * * @param \DOMDocument $xml * @param string $file + * @param array $defaults */ - private function processAnonymousServices(\DOMDocument $xml, $file) + private function processAnonymousServices(\DOMDocument $xml, $file, $defaults) { $definitions = array(); $count = 0; + $suffix = '~'.ContainerBuilder::hash($file); $xpath = new \DOMXPath($xml); $xpath->registerNamespace('container', self::NS); // anonymous services as arguments/properties - if (false !== $nodes = $xpath->query('//container:argument[@type="service"][not(@id)]|//container:property[@type="service"][not(@id)]')) { + if (false !== $nodes = $xpath->query('//container:argument[@type="service"][not(@id)]|//container:property[@type="service"][not(@id)]|//container:bind[not(@id)]|//container:factory[not(@service)]|//container:configurator[not(@service)]')) { foreach ($nodes as $node) { - // give it a unique name - $id = sprintf('%s_%d', hash('sha256', $file), ++$count); - $node->setAttribute('id', $id); - if ($services = $this->getChildren($node, 'service')) { + // give it a unique name + $id = sprintf('%d_%s', ++$count, preg_replace('/^.*\\\\/', '', $services[0]->getAttribute('class')).$suffix); + $node->setAttribute('id', $id); + $node->setAttribute('service', $id); + $definitions[$id] = array($services[0], $file, false); $services[0]->setAttribute('id', $id); @@ -305,26 +429,26 @@ class XmlFileLoader extends FileLoader // anonymous services "in the wild" if (false !== $nodes = $xpath->query('//container:services/container:service[not(@id)]')) { foreach ($nodes as $node) { + @trigger_error(sprintf('Top-level anonymous services are deprecated since Symfony 3.4, the "id" attribute will be required in version 4.0 in %s at line %d.', $file, $node->getLineNo()), E_USER_DEPRECATED); + // give it a unique name - $id = sprintf('%s_%d', hash('sha256', $file), ++$count); + $id = sprintf('%d_%s', ++$count, preg_replace('/^.*\\\\/', '', $node->getAttribute('class')).$suffix); $node->setAttribute('id', $id); $definitions[$id] = array($node, $file, true); } } // resolve definitions - krsort($definitions); - foreach ($definitions as $id => list($domElement, $file, $wild)) { - if (null !== $definition = $this->parseDefinition($domElement, $file)) { - $this->container->setDefinition($id, $definition); + uksort($definitions, 'strnatcmp'); + foreach (array_reverse($definitions) as $id => list($domElement, $file, $wild)) { + if (null !== $definition = $this->parseDefinition($domElement, $file, $wild ? $defaults : array())) { + $this->setDefinition($id, $definition); } if (true === $wild) { $tmpDomElement = new \DOMElement('_services', null, self::NS); $domElement->parentNode->replaceChild($tmpDomElement, $domElement); $tmpDomElement->setAttribute('id', $id); - } else { - $domElement->parentNode->removeChild($domElement); } } } @@ -334,11 +458,12 @@ class XmlFileLoader extends FileLoader * * @param \DOMElement $node * @param string $name + * @param string $file * @param bool $lowercase * * @return mixed */ - private function getArgumentsAsPhp(\DOMElement $node, $name, $lowercase = true) + private function getArgumentsAsPhp(\DOMElement $node, $name, $file, $lowercase = true, $isChildDefinition = false) { $arguments = array(); foreach ($this->getChildren($node, $name) as $arg) { @@ -346,10 +471,10 @@ class XmlFileLoader extends FileLoader $arg->setAttribute('key', $arg->getAttribute('name')); } - // this is used by DefinitionDecorator to overwrite a specific + // this is used by ChildDefinition to overwrite a specific // argument of the parent definition if ($arg->hasAttribute('index')) { - $key = 'index_'.$arg->getAttribute('index'); + $key = ($isChildDefinition ? 'index_' : '').$arg->getAttribute('index'); } elseif (!$arg->hasAttribute('key')) { // Append an empty argument, then fetch its key to overwrite it later $arguments[] = null; @@ -357,36 +482,58 @@ class XmlFileLoader extends FileLoader $key = array_pop($keys); } else { $key = $arg->getAttribute('key'); + } - // parameter keys are case insensitive - if ('parameter' == $name && $lowercase) { - $key = strtolower($key); - } + $onInvalid = $arg->getAttribute('on-invalid'); + $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE; + if ('ignore' == $onInvalid) { + $invalidBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE; + } elseif ('ignore_uninitialized' == $onInvalid) { + $invalidBehavior = ContainerInterface::IGNORE_ON_UNINITIALIZED_REFERENCE; + } elseif ('null' == $onInvalid) { + $invalidBehavior = ContainerInterface::NULL_ON_INVALID_REFERENCE; } switch ($arg->getAttribute('type')) { case 'service': - $onInvalid = $arg->getAttribute('on-invalid'); - $invalidBehavior = ContainerInterface::EXCEPTION_ON_INVALID_REFERENCE; - if ('ignore' == $onInvalid) { - $invalidBehavior = ContainerInterface::IGNORE_ON_INVALID_REFERENCE; - } elseif ('null' == $onInvalid) { - $invalidBehavior = ContainerInterface::NULL_ON_INVALID_REFERENCE; + if (!$arg->getAttribute('id')) { + throw new InvalidArgumentException(sprintf('Tag "<%s>" with type="service" has no or empty "id" attribute in "%s".', $name, $file)); + } + if ($arg->hasAttribute('strict')) { + @trigger_error(sprintf('The "strict" attribute used when referencing the "%s" service is deprecated since Symfony 3.3 and will be removed in 4.0.', $arg->getAttribute('id')), E_USER_DEPRECATED); } $arguments[$key] = new Reference($arg->getAttribute('id'), $invalidBehavior); break; case 'expression': + if (!class_exists(Expression::class)) { + throw new \LogicException(sprintf('The type="expression" attribute cannot be used without the ExpressionLanguage component. Try running "composer require symfony/expression-language".')); + } + $arguments[$key] = new Expression($arg->nodeValue); break; case 'collection': - $arguments[$key] = $this->getArgumentsAsPhp($arg, $name, false); + $arguments[$key] = $this->getArgumentsAsPhp($arg, $name, $file, false); + break; + case 'iterator': + $arg = $this->getArgumentsAsPhp($arg, $name, $file, false); + try { + $arguments[$key] = new IteratorArgument($arg); + } catch (InvalidArgumentException $e) { + throw new InvalidArgumentException(sprintf('Tag "<%s>" with type="iterator" only accepts collections of type="service" references in "%s".', $name, $file)); + } + break; + case 'tagged': + if (!$arg->getAttribute('tag')) { + throw new InvalidArgumentException(sprintf('Tag "<%s>" with type="tagged" has no or empty "tag" attribute in "%s".', $name, $file)); + } + $arguments[$key] = new TaggedIteratorArgument($arg->getAttribute('tag')); break; case 'string': $arguments[$key] = $arg->nodeValue; break; case 'constant': - $arguments[$key] = constant(trim($arg->nodeValue)); + $arguments[$key] = \constant(trim($arg->nodeValue)); break; default: $arguments[$key] = XmlUtils::phpize($arg->nodeValue); @@ -408,7 +555,7 @@ class XmlFileLoader extends FileLoader { $children = array(); foreach ($node->childNodes as $child) { - if ($child instanceof \DOMElement && $child->localName === $name && $child->namespaceURI === self::NS) { + if ($child instanceof \DOMElement && $child->localName === $name && self::NS === $child->namespaceURI) { $children[] = $child; } } @@ -431,7 +578,7 @@ class XmlFileLoader extends FileLoader if ($element = $dom->documentElement->getAttributeNS('http://www.w3.org/2001/XMLSchema-instance', 'schemaLocation')) { $items = preg_split('/\s+/', $element); - for ($i = 0, $nb = count($items); $i < $nb; $i += 2) { + for ($i = 0, $nb = \count($items); $i < $nb; $i += 2) { if (!$this->container->hasExtension($items[$i])) { continue; } @@ -440,7 +587,7 @@ class XmlFileLoader extends FileLoader $path = str_replace($extension->getNamespace(), str_replace('\\', '/', $extension->getXsdValidationBasePath()).'/', $items[$i + 1]); if (!is_file($path)) { - throw new RuntimeException(sprintf('Extension "%s" references a non-existent XSD file "%s"', get_class($extension), $path)); + throw new RuntimeException(sprintf('Extension "%s" references a non-existent XSD file "%s"', \get_class($extension), $path)); } $schemaLocations[$items[$i]] = $path; @@ -452,16 +599,20 @@ class XmlFileLoader extends FileLoader $imports = ''; foreach ($schemaLocations as $namespace => $location) { $parts = explode('/', $location); + $locationstart = 'file:///'; if (0 === stripos($location, 'phar://')) { - $tmpfile = tempnam(sys_get_temp_dir(), 'sf2'); + $tmpfile = tempnam(sys_get_temp_dir(), 'symfony'); if ($tmpfile) { copy($location, $tmpfile); $tmpfiles[] = $tmpfile; $parts = explode('/', str_replace('\\', '/', $tmpfile)); + } else { + array_shift($parts); + $locationstart = 'phar:///'; } } - $drive = '\\' === DIRECTORY_SEPARATOR ? array_shift($parts).'/' : ''; - $location = 'file:///'.$drive.implode('/', array_map('rawurlencode', $parts)); + $drive = '\\' === \DIRECTORY_SEPARATOR ? array_shift($parts).'/' : ''; + $location = $locationstart.$drive.implode('/', array_map('rawurlencode', $parts)); $imports .= sprintf(' '."\n", $namespace, $location); } @@ -499,13 +650,13 @@ EOF private function validateAlias(\DOMElement $alias, $file) { foreach ($alias->attributes as $name => $node) { - if (!in_array($name, array('alias', 'id', 'public'))) { + if (!\in_array($name, array('alias', 'id', 'public'))) { @trigger_error(sprintf('Using the attribute "%s" is deprecated for the service "%s" which is defined as an alias in "%s". Allowed attributes for service aliases are "alias", "id" and "public". The XmlFileLoader will raise an exception in Symfony 4.0, instead of silently ignoring unsupported attributes.', $name, $alias->getAttribute('id'), $file), E_USER_DEPRECATED); } } foreach ($alias->childNodes as $child) { - if ($child instanceof \DOMElement && $child->namespaceURI === self::NS) { + if ($child instanceof \DOMElement && self::NS === $child->namespaceURI) { @trigger_error(sprintf('Using the element "%s" is deprecated for the service "%s" which is defined as an alias in "%s". The XmlFileLoader will raise an exception in Symfony 4.0, instead of silently ignoring unsupported elements.', $child->localName, $alias->getAttribute('id'), $file), E_USER_DEPRECATED); } } @@ -529,13 +680,7 @@ EOF // can it be handled by an extension? if (!$this->container->hasExtension($node->namespaceURI)) { $extensionNamespaces = array_filter(array_map(function ($ext) { return $ext->getNamespace(); }, $this->container->getExtensions())); - throw new InvalidArgumentException(sprintf( - 'There is no extension able to load the configuration for "%s" (in %s). Looked for namespace "%s", found %s', - $node->tagName, - $file, - $node->namespaceURI, - $extensionNamespaces ? sprintf('"%s"', implode('", "', $extensionNamespaces)) : 'none' - )); + throw new InvalidArgumentException(sprintf('There is no extension able to load the configuration for "%s" (in %s). Looked for namespace "%s", found %s', $node->tagName, $file, $node->namespaceURI, $extensionNamespaces ? sprintf('"%s"', implode('", "', $extensionNamespaces)) : 'none')); } } } @@ -548,12 +693,12 @@ EOF private function loadFromExtensions(\DOMDocument $xml) { foreach ($xml->documentElement->childNodes as $node) { - if (!$node instanceof \DOMElement || $node->namespaceURI === self::NS) { + if (!$node instanceof \DOMElement || self::NS === $node->namespaceURI) { continue; } $values = static::convertDomElementToArray($node); - if (!is_array($values)) { + if (!\is_array($values)) { $values = array(); } @@ -562,7 +707,7 @@ EOF } /** - * Converts a \DomElement object to a PHP array. + * Converts a \DOMElement object to a PHP array. * * The following rules applies during the conversion: * @@ -576,7 +721,7 @@ EOF * * * The nested-tags are converted to keys (bar) * - * @param \DomElement $element A \DomElement instance + * @param \DOMElement $element A \DOMElement instance * * @return array A PHP array */