diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 3e17081246b60..9932e34272396 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -1548,7 +1548,7 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder } if ($container->getParameter('kernel.debug') && class_exists(Stopwatch::class)) { - array_unshift($middleware, array('id' => 'traceable', 'arguments' => array($busId))); + array_unshift($middleware, array('id' => 'traceable', 'arguments' => array(1 => $busId))); } $container->setParameter($busId.'.middleware', $middleware); diff --git a/src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php b/src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php index 573907b86ef1b..d595015f5c0e0 100644 --- a/src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php +++ b/src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php @@ -319,7 +319,8 @@ private function registerBusMiddleware(ContainerBuilder $container, string $busI if (($definition = $container->findDefinition($messengerMiddlewareId))->isAbstract()) { $childDefinition = new ChildDefinition($messengerMiddlewareId); $count = \count($definition->getArguments()); - foreach (array_values($arguments ?? array()) as $key => $argument) { + + foreach (($arguments ?? array()) as $key => $argument) { // Parent definition can provide default arguments. // Replace each explicitly or add if not set: $key < $count ? $childDefinition->replaceArgument($key, $argument) : $childDefinition->addArgument($argument); diff --git a/src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php b/src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php index 0795b2b179c33..cc7cae6e260ba 100644 --- a/src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php +++ b/src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php @@ -494,12 +494,14 @@ public function testRegistersMiddlewareFromServices() $container = $this->getContainerBuilder($fooBusId = 'messenger.bus.foo'); $container->register('middleware_with_factory', UselessMiddleware::class)->addArgument('some_default')->setAbstract(true); $container->register('middleware_with_factory_using_default', UselessMiddleware::class)->addArgument('some_default')->setAbstract(true); + $container->register('middleware_with_factory_using_a_lot_of_defaults', UselessMiddleware::class)->setArguments(array('one', 'two', 'three'))->setAbstract(true); $container->register(UselessMiddleware::class, UselessMiddleware::class); $container->setParameter($middlewareParameter = $fooBusId.'.middleware', array( array('id' => UselessMiddleware::class), array('id' => 'middleware_with_factory', 'arguments' => array('foo', 'bar')), array('id' => 'middleware_with_factory_using_default'), + array('id' => 'middleware_with_factory_using_a_lot_of_defaults', 'arguments' => array(1 => '2', 3 => 'four')), )); (new MessengerPass())->process($container); @@ -519,10 +521,18 @@ public function testRegistersMiddlewareFromServices() 'parent default argument is used' ); + $this->assertTrue($container->hasDefinition($factoryWithALotOfDefaultsChildMiddlewareId = $fooBusId.'.middleware.middleware_with_factory_using_a_lot_of_defaults')); + $this->assertEquals( + array('one', '2', 'three', 'four'), + $container->getDefinition($factoryWithALotOfDefaultsChildMiddlewareId)->getArguments(), + 'parent arguments are not overwritten' + ); + $this->assertEquals(array( new Reference(UselessMiddleware::class), new Reference($factoryChildMiddlewareId), new Reference($factoryWithDefaultChildMiddlewareId), + new Reference($factoryWithALotOfDefaultsChildMiddlewareId), ), $container->getDefinition($fooBusId)->getArgument(0)->getValues()); $this->assertFalse($container->hasParameter($middlewareParameter)); }