Allow same middleware to be used multiple times with different arguments

This commit is contained in:
HypeMC 2020-07-13 20:19:17 +02:00
parent 701161eb40
commit d10e43d085
2 changed files with 21 additions and 6 deletions

View File

@ -339,7 +339,7 @@ class MessengerPass implements CompilerPassInterface
if ($container->findDefinition($messengerMiddlewareId)->isAbstract()) {
$childDefinition = new ChildDefinition($messengerMiddlewareId);
$childDefinition->setArguments($arguments);
$container->setDefinition($messengerMiddlewareId = $busId.'.middleware.'.$id, $childDefinition);
$container->setDefinition($messengerMiddlewareId = $busId.'.middleware.'.$id.'.'.ContainerBuilder::hash($arguments), $childDefinition);
} elseif ($arguments) {
throw new RuntimeException(sprintf('Invalid middleware factory "%s": a middleware factory must be an abstract definition.', $id));
}

View File

@ -508,21 +508,35 @@ class MessengerPassTest extends TestCase
$container->setParameter($middlewareParameter = $fooBusId.'.middleware', [
['id' => UselessMiddleware::class],
['id' => 'middleware_with_factory', 'arguments' => ['index_0' => 'foo', 'bar']],
['id' => 'middleware_with_factory', 'arguments' => $factoryChildMiddlewareArgs1 = ['index_0' => 'foo', 'bar']],
['id' => 'middleware_with_factory', 'arguments' => $factoryChildMiddlewareArgs2 = ['index_0' => 'baz']],
['id' => 'middleware_with_factory_using_default'],
]);
(new MessengerPass())->process($container);
(new ResolveChildDefinitionsPass())->process($container);
$this->assertTrue($container->hasDefinition($factoryChildMiddlewareId = $fooBusId.'.middleware.middleware_with_factory'));
$this->assertTrue($container->hasDefinition(
$factoryChildMiddlewareArgs1Id = $fooBusId.'.middleware.middleware_with_factory.'.ContainerBuilder::hash($factoryChildMiddlewareArgs1)
));
$this->assertEquals(
['foo', 'bar'],
$container->getDefinition($factoryChildMiddlewareId)->getArguments(),
$container->getDefinition($factoryChildMiddlewareArgs1Id)->getArguments(),
'parent default argument is overridden, and next ones appended'
);
$this->assertTrue($container->hasDefinition($factoryWithDefaultChildMiddlewareId = $fooBusId.'.middleware.middleware_with_factory_using_default'));
$this->assertTrue($container->hasDefinition(
$factoryChildMiddlewareArgs2Id = $fooBusId.'.middleware.middleware_with_factory.'.ContainerBuilder::hash($factoryChildMiddlewareArgs2)
));
$this->assertEquals(
['baz'],
$container->getDefinition($factoryChildMiddlewareArgs2Id)->getArguments(),
'parent default argument is overridden, and next ones appended'
);
$this->assertTrue($container->hasDefinition(
$factoryWithDefaultChildMiddlewareId = $fooBusId.'.middleware.middleware_with_factory_using_default.'.ContainerBuilder::hash([])
));
$this->assertEquals(
['some_default'],
$container->getDefinition($factoryWithDefaultChildMiddlewareId)->getArguments(),
@ -531,7 +545,8 @@ class MessengerPassTest extends TestCase
$this->assertEquals([
new Reference(UselessMiddleware::class),
new Reference($factoryChildMiddlewareId),
new Reference($factoryChildMiddlewareArgs1Id),
new Reference($factoryChildMiddlewareArgs2Id),
new Reference($factoryWithDefaultChildMiddlewareId),
], $container->getDefinition($fooBusId)->getArgument(0)->getValues());
$this->assertFalse($container->hasParameter($middlewareParameter));