Skip to content

Commit 0b99a8e

Browse files
bug #29558 [Messenger] Restore message handlers laziness (chalasr)
This PR was merged into the 4.2 branch. Discussion ---------- [Messenger] Restore message handlers laziness | Q | A | ------------- | --- | Branch? | 4.2 | Bug fix? | yes | New feature? | no | BC breaks? | no | Deprecations? | no | Tests pass? | yes | Fixed tickets | n/a | License | MIT | Doc PR | n/a The `HandlersLocator` introduced in 4.2 currently needs to instantiate all message handlers of the bus in order to be wired, while they were lazily loaded in 4.1 via ContainerHandlerLocator (removed). Example: ```yaml framework: messenger: buses: messenger.bus.command: ~ services: App\Messenger\: resource: '../src/Messenger/*Handler.php' tags: - { name: messenger.message_handler, bus: messenger.bus.command } ``` ```php namespace App\Messenger; class BarCommand {} class BarCommandHandler { public function __invoke(BarCommand $command): void {} } class FooCommand {} class FooCommandHandler { public function __invoke(FooCommand $command): void {} } ``` (Dumped `HandleMessageMiddleware` factory) Before: ```php return $this->privates['messenger.bus.command.middleware.handle_message'] = new \Symfony\Component\Messenger\Middleware\HandleMessageMiddleware(new \Symfony\Component\Messenger\Handler\HandlersLocator(array( 'App\\Messenger\\BarCommand' => \current(array(0 => array(0 => new \App\Messenger\BarCommandHandler()))), 'App\\Messenger\\FooCommand' => \current(array(0 => array(0 => new \App\Messenger\FooCommandHandler()))) ))); ``` After: ```php return $this->privates['messenger.bus.command.middleware.handle_message'] = new \Symfony\Component\Messenger\Middleware\HandleMessageMiddleware(new \Symfony\Component\Messenger\Handler\HandlersLocator(array( 'App\\Messenger\\BarCommand' => new RewindableGenerator(function () { yield 0 => ($this->privates['App\Messenger\BarCommandHandler'] ?? ($this->privates['App\Messenger\BarCommandHandler'] = new \App\Messenger\BarCommandHandler())); }, 1), 'App\\Messenger\\FooCommand' => new RewindableGenerator(function () { yield 0 => ($this->privates['App\Messenger\FooCommandHandler'] ?? ($this->privates['App\Messenger\FooCommandHandler'] = new \App\Messenger\FooCommandHandler())); }, 1) ))); ``` Commits ------- c608e73 [Messenger] Restore message handlers laziness
2 parents e3123f8 + c608e73 commit 0b99a8e

File tree

4 files changed

+19
-32
lines changed

4 files changed

+19
-32
lines changed

src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,6 @@
3737
use Symfony\Component\Console\Command\Command;
3838
use Symfony\Component\DependencyInjection\Alias;
3939
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
40-
use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
4140
use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
4241
use Symfony\Component\DependencyInjection\ChildDefinition;
4342
use Symfony\Component\DependencyInjection\ContainerBuilder;
@@ -1600,12 +1599,7 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
16001599
$senders[$sender] = new Reference($senderAliases[$sender] ?? $sender);
16011600
}
16021601

1603-
$sendersId = 'messenger.senders.'.$message;
1604-
$container->register($sendersId, RewindableGenerator::class)
1605-
->setFactory('current')
1606-
->addArgument(array(new IteratorArgument($senders)));
1607-
$messageToSendersMapping[$message] = new Reference($sendersId);
1608-
1602+
$messageToSendersMapping[$message] = new IteratorArgument($senders);
16091603
$messagesToSendAndHandle[$message] = $messageConfiguration['send_and_handle'];
16101604
}
16111605

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTest.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -651,10 +651,11 @@ public function testMessengerRouting()
651651
);
652652

653653
$this->assertSame($messageToSendAndHandleMapping, $senderLocatorDefinition->getArgument(1));
654+
$sendersMapping = $senderLocatorDefinition->getArgument(0);
654655
$this->assertEquals(array(
655656
'amqp' => new Reference('messenger.transport.amqp'),
656657
'audit' => new Reference('audit'),
657-
), $container->getDefinition('messenger.senders.'.DummyMessage::class)->getArgument(0)[0]->getValues());
658+
), $sendersMapping[DummyMessage::class]->getValues());
658659
}
659660

660661
/**

src/Symfony/Component/Messenger/DependencyInjection/MessengerPass.php

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
namespace Symfony\Component\Messenger\DependencyInjection;
1313

1414
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
15-
use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
1615
use Symfony\Component\DependencyInjection\ChildDefinition;
1716
use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
1817
use Symfony\Component\DependencyInjection\Compiler\ServiceLocatorTagPass;
@@ -163,11 +162,7 @@ private function registerHandlers(ContainerBuilder $container, array $busIds)
163162
foreach ($handlersByBusAndMessage as $bus => $handlersByMessage) {
164163
foreach ($handlersByMessage as $message => $handlerIds) {
165164
$handlers = array_map(function (string $handlerId) { return new Reference($handlerId); }, $handlerIds);
166-
$handlersId = "messenger.handlers.$bus.$message";
167-
$definitions[$handlersId] = (new Definition(RewindableGenerator::class))
168-
->setFactory('current')
169-
->addArgument(array($handlers));
170-
$handlersLocatorMappingByBus[$bus][$message] = new Reference($handlersId);
165+
$handlersLocatorMappingByBus[$bus][$message] = new IteratorArgument($handlers);
171166
}
172167
}
173168
$container->addDefinitions($definitions);

src/Symfony/Component/Messenger/Tests/DependencyInjection/MessengerPassTest.php

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
namespace Symfony\Component\Messenger\Tests\DependencyInjection;
1313

1414
use PHPUnit\Framework\TestCase;
15-
use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
15+
use Symfony\Component\DependencyInjection\Argument\IteratorArgument;
1616
use Symfony\Component\DependencyInjection\Compiler\ResolveChildDefinitionsPass;
1717
use Symfony\Component\DependencyInjection\Compiler\ResolveClassPass;
1818
use Symfony\Component\DependencyInjection\ContainerBuilder;
@@ -67,8 +67,8 @@ public function testProcess()
6767
$this->assertSame(HandlersLocator::class, $handlersLocatorDefinition->getClass());
6868
$this->assertEquals(
6969
array(
70-
DummyMessage::class => new Reference("messenger.handlers.$busId.".DummyMessage::class),
71-
SecondMessage::class => new Reference("messenger.handlers.$busId.".SecondMessage::class),
70+
DummyMessage::class => new IteratorArgument(array(new Reference(DummyHandler::class))),
71+
SecondMessage::class => new IteratorArgument(array(new Reference(MissingArgumentTypeHandler::class))),
7272
),
7373
$handlersLocatorDefinition->getArgument(0)
7474
);
@@ -107,8 +107,8 @@ public function testProcessHandlersByBus()
107107
$this->assertSame(HandlersLocator::class, $commandBusHandlersLocatorDefinition->getClass());
108108
$this->assertEquals(
109109
array(
110-
MultipleBusesMessage::class => new Reference("messenger.handlers.$commandBusId.".MultipleBusesMessage::class),
111-
DummyCommand::class => new Reference("messenger.handlers.$commandBusId.".DummyCommand::class),
110+
MultipleBusesMessage::class => new IteratorArgument(array(new Reference(MultipleBusesMessageHandler::class))),
111+
DummyCommand::class => new IteratorArgument(array(new Reference(DummyCommandHandler::class))),
112112
),
113113
$commandBusHandlersLocatorDefinition->getArgument(0)
114114
);
@@ -117,8 +117,8 @@ public function testProcessHandlersByBus()
117117
$this->assertSame(HandlersLocator::class, $queryBusHandlersLocatorDefinition->getClass());
118118
$this->assertEquals(
119119
array(
120-
DummyQuery::class => new Reference("messenger.handlers.$queryBusId.".DummyQuery::class),
121-
MultipleBusesMessage::class => new Reference("messenger.handlers.$queryBusId.".MultipleBusesMessage::class),
120+
DummyQuery::class => new IteratorArgument(array(new Reference(DummyQueryHandler::class))),
121+
MultipleBusesMessage::class => new IteratorArgument(array(new Reference(MultipleBusesMessageHandler::class))),
122122
),
123123
$queryBusHandlersLocatorDefinition->getArgument(0)
124124
);
@@ -155,13 +155,10 @@ public function testGetClassesFromTheHandlerSubscriberInterface()
155155
$handlersMapping = $container->getDefinition($busId.'.messenger.handlers_locator')->getArgument(0);
156156

157157
$this->assertArrayHasKey(DummyMessage::class, $handlersMapping);
158-
$this->assertEquals(new Reference("messenger.handlers.$busId.".DummyMessage::class), $handlersMapping[DummyMessage::class]);
158+
$this->assertEquals(new IteratorArgument(array(new Reference(HandlerWithMultipleMessages::class))), $handlersMapping[DummyMessage::class]);
159159

160160
$this->assertArrayHasKey(SecondMessage::class, $handlersMapping);
161-
$handlersDefinition = $container->getDefinition($handlersMapping[SecondMessage::class]);
162-
163-
$this->assertSame(RewindableGenerator::class, $handlersDefinition->getClass());
164-
$this->assertEquals(array(new Reference(PrioritizedHandler::class), new Reference(HandlerWithMultipleMessages::class)), $handlersDefinition->getArgument(0)[0]);
161+
$this->assertEquals(new IteratorArgument(array(new Reference(PrioritizedHandler::class), new Reference(HandlerWithMultipleMessages::class))), $handlersMapping[SecondMessage::class]);
165162
}
166163

167164
public function testGetClassesAndMethodsAndPrioritiesFromTheSubscriber()
@@ -183,13 +180,13 @@ public function testGetClassesAndMethodsAndPrioritiesFromTheSubscriber()
183180
$this->assertArrayHasKey(DummyMessage::class, $handlersMapping);
184181
$this->assertArrayHasKey(SecondMessage::class, $handlersMapping);
185182

186-
$dummyHandlerReference = $container->getDefinition($handlersMapping[DummyMessage::class])->getArgument(0)[0][0];
183+
$dummyHandlerReference = $handlersMapping[DummyMessage::class]->getValues()[0];
187184
$dummyHandlerDefinition = $container->getDefinition($dummyHandlerReference);
188185
$this->assertSame('callable', $dummyHandlerDefinition->getClass());
189186
$this->assertEquals(array(new Reference(HandlerMappingMethods::class), 'dummyMethod'), $dummyHandlerDefinition->getArgument(0));
190187
$this->assertSame(array('Closure', 'fromCallable'), $dummyHandlerDefinition->getFactory());
191188

192-
$secondHandlerReference = $container->getDefinition($handlersMapping[SecondMessage::class])->getArgument(0)[0][1];
189+
$secondHandlerReference = $handlersMapping[SecondMessage::class]->getValues()[1];
193190
$secondHandlerDefinition = $container->getDefinition($secondHandlerReference);
194191
$this->assertSame(PrioritizedHandler::class, $secondHandlerDefinition->getClass());
195192
}
@@ -281,11 +278,11 @@ public function testItShouldNotThrowIfGeneratorIsReturnedInsteadOfArray()
281278
$handlersMapping = $container->getDefinition($busId.'.messenger.handlers_locator')->getArgument(0);
282279

283280
$this->assertArrayHasKey(DummyMessage::class, $handlersMapping);
284-
$firstReference = $container->getDefinition($handlersMapping[DummyMessage::class])->getArgument(0)[0][0];
281+
$firstReference = $handlersMapping[DummyMessage::class]->getValues()[0];
285282
$this->assertEquals(array(new Reference(HandlerWithGenerators::class), 'dummyMethod'), $container->getDefinition($firstReference)->getArgument(0));
286283

287284
$this->assertArrayHasKey(SecondMessage::class, $handlersMapping);
288-
$secondReference = $container->getDefinition($handlersMapping[SecondMessage::class])->getArgument(0)[0][0];
285+
$secondReference = $handlersMapping[SecondMessage::class]->getValues()[0];
289286
$this->assertEquals(array(new Reference(HandlerWithGenerators::class), 'secondMessage'), $container->getDefinition($secondReference)->getArgument(0));
290287
}
291288

@@ -304,13 +301,13 @@ public function testItRegistersHandlersOnDifferentBuses()
304301
$eventsHandlerMapping = $container->getDefinition($eventsBusId.'.messenger.handlers_locator')->getArgument(0);
305302

306303
$this->assertEquals(array(DummyMessage::class), array_keys($eventsHandlerMapping));
307-
$firstReference = $container->getDefinition($eventsHandlerMapping[DummyMessage::class])->getArgument(0)[0][0];
304+
$firstReference = $eventsHandlerMapping[DummyMessage::class]->getValues()[0];
308305
$this->assertEquals(array(new Reference(HandlerOnSpecificBuses::class), 'dummyMethodForEvents'), $container->getDefinition($firstReference)->getArgument(0));
309306

310307
$commandsHandlerMapping = $container->getDefinition($commandsBusId.'.messenger.handlers_locator')->getArgument(0);
311308

312309
$this->assertEquals(array(DummyMessage::class), array_keys($commandsHandlerMapping));
313-
$firstReference = $container->getDefinition($commandsHandlerMapping[DummyMessage::class])->getArgument(0)[0][0];
310+
$firstReference = $commandsHandlerMapping[DummyMessage::class]->getValues()[0];
314311
$this->assertEquals(array(new Reference(HandlerOnSpecificBuses::class), 'dummyMethodForCommands'), $container->getDefinition($firstReference)->getArgument(0));
315312
}
316313

0 commit comments

Comments
 (0)