diff --git a/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php b/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php
index e60c2f7df76c1..b3e4ef4d3e7c1 100644
--- a/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php
+++ b/src/Symfony/Component/DependencyInjection/Loader/XmlFileLoader.php
@@ -346,21 +346,22 @@ private function getArgumentsAsPhp(\DOMElement $node, $name, $lowercase = true)
$arg->setAttribute('key', $arg->getAttribute('name'));
}
- if (!$arg->hasAttribute('key')) {
- $key = !$arguments ? 0 : max(array_keys($arguments)) + 1;
- } else {
- $key = $arg->getAttribute('key');
- }
-
- // parameter keys are case insensitive
- if ('parameter' == $name && $lowercase) {
- $key = strtolower($key);
- }
-
// this is used by DefinitionDecorator to overwrite a specific
// argument of the parent definition
if ($arg->hasAttribute('index')) {
$key = 'index_'.$arg->getAttribute('index');
+ } elseif (!$arg->hasAttribute('key')) {
+ // Append an empty argument, then fetch its key to overwrite it later
+ $arguments[] = null;
+ $keys = array_keys($arguments);
+ $key = array_pop($keys);
+ } else {
+ $key = $arg->getAttribute('key');
+
+ // parameter keys are case insensitive
+ if ('parameter' == $name && $lowercase) {
+ $key = strtolower($key);
+ }
}
switch ($arg->getAttribute('type')) {
diff --git a/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/with_key_outside_collection.xml b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/with_key_outside_collection.xml
new file mode 100644
index 0000000000000..5f3a2843612df
--- /dev/null
+++ b/src/Symfony/Component/DependencyInjection/Tests/Fixtures/xml/with_key_outside_collection.xml
@@ -0,0 +1,9 @@
+
+
Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.
Alternative Proxies: