Skip to content

Commit dea6e82

Browse files
committed
Uses a service locator for the message senders as well
1 parent 53f7927 commit dea6e82

File tree

4 files changed

+31
-17
lines changed

4 files changed

+31
-17
lines changed

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

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,6 @@
4242
use Symfony\Component\DependencyInjection\ParameterBag\ContainerBagInterface;
4343
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
4444
use Symfony\Component\DependencyInjection\Reference;
45-
use Symfony\Component\DependencyInjection\ServiceLocator;
4645
use Symfony\Component\DependencyInjection\ServiceSubscriberInterface;
4746
use Symfony\Component\EventDispatcher\EventSubscriberInterface;
4847
use Symfony\Component\ExpressionLanguage\ExpressionLanguage;
@@ -1390,18 +1389,20 @@ private function registerMessageConfiguration(array $config, ContainerBuilder $c
13901389
{
13911390
$loader->load('message.xml');
13921391

1393-
$messageToSenderMapping = array();
1392+
$senderLocatorMapping = array();
1393+
$messageToSenderIdsMapping = array();
13941394
foreach ($config['routing'] as $message => $messageConfiguration) {
1395-
$messageToSenderMapping[$message] = array_map(function (?string $service) {
1396-
if (is_string($service)) {
1397-
return new Reference($service);
1395+
foreach ($messageConfiguration['senders'] as $sender) {
1396+
if (null !== $sender) {
1397+
$senderLocatorMapping[$sender] = new Reference($sender);
13981398
}
1399+
}
13991400

1400-
return $service;
1401-
}, $messageConfiguration['senders']);
1401+
$messageToSenderIdsMapping[$message] = $messageConfiguration['senders'];
14021402
}
14031403

1404-
$container->getDefinition('message.asynchronous.routing.sender_locator')->setArgument(0, $messageToSenderMapping);
1404+
$container->getDefinition('message.sender_locator')->replaceArgument(0, $senderLocatorMapping);
1405+
$container->getDefinition('message.asynchronous.routing.sender_locator')->replaceArgument(1, $messageToSenderIdsMapping);
14051406
}
14061407

14071408
private function registerCacheConfiguration(array $config, ContainerBuilder $container)

src/Symfony/Bundle/FrameworkBundle/Resources/config/message.xml

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,8 @@
2727

2828
<!-- Asynchronous -->
2929
<service id="message.asynchronous.routing.sender_locator" class="Symfony\Component\Message\Asynchronous\Routing\SenderLocator">
30-
<argument type="collection" /> <!-- Message to sender mapping -->
30+
<argument type="service" id="message.sender_locator" />
31+
<argument /> <!-- Message to sender ID mapping -->
3132
</service>
3233
<service id="message.asynchronous.middleware.send_message_to_producer" class="Symfony\Component\Message\Asynchronous\Middleware\SendMessageMiddleware">
3334
<argument type="service" id="message.asynchronous.routing.sender_locator" />
@@ -61,5 +62,9 @@
6162
<tag name="container.service_locator" />
6263
<argument type="collection" />
6364
</service>
65+
<service id="message.sender_locator">
66+
<tag name="container.service_locator" />
67+
<argument type="collection" />
68+
</service>
6469
</services>
6570
</container>

src/Symfony/Component/Message/Asynchronous/Routing/SenderLocator.php

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,26 +11,34 @@
1111

1212
namespace Symfony\Component\Message\Asynchronous\Routing;
1313

14+
use Psr\Container\ContainerInterface;
15+
1416
/**
1517
* @author Samuel Roze <samuel.roze@gmail.com>
1618
*/
1719
class SenderLocator implements SenderLocatorInterface
1820
{
19-
/**
20-
* Mapping describing which sender should be used for which message.
21-
*/
22-
private $messageToSenderMapping;
21+
private $senderServiceLocator;
22+
private $messageToSenderIdsMapping;
2323

24-
public function __construct(array $messageToSenderMapping)
24+
public function __construct(ContainerInterface $senderServiceLocator, array $messageToSenderIdsMapping)
2525
{
26-
$this->messageToSenderMapping = $messageToSenderMapping;
26+
$this->senderServiceLocator = $senderServiceLocator;
27+
$this->messageToSenderIdsMapping = $messageToSenderIdsMapping;
2728
}
2829

2930
/**
3031
* {@inheritdoc}
3132
*/
3233
public function getSendersForMessage($message): array
3334
{
34-
return $this->messageToSenderMapping[get_class($message)] ?? $this->messageToSenderMapping['*'] ?? array();
35+
$senderIds = $this->messageToSenderIdsMapping[get_class($message)] ?? $this->messageToSenderIdsMapping['*'] ?? array();
36+
37+
$senders = array();
38+
foreach ($senderIds as $senderId) {
39+
$senders[] = $this->senderServiceLocator->get($senderId);
40+
}
41+
42+
return $senders;
3543
}
3644
}

src/Symfony/Component/Message/DependencyInjection/MessagePass.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,7 @@ private function guessHandledClass(ContainerBuilder $container, string $serviceI
117117

118118
private function registerReceivers(ContainerBuilder $container)
119119
{
120-
$receiverMapping = [];
120+
$receiverMapping = array();
121121
foreach ($container->findTaggedServiceIds('message.receiver') as $id => $tags) {
122122
foreach ($tags as $tag) {
123123
$receiverMapping[$tag['id'] ?? $id] = new Reference($id);

0 commit comments

Comments
 (0)