Skip to content

Commit b856602

Browse files
committed
[Messenger] Removing "sync" transport and replacing it with much nicer config trick
1 parent 6b437d5 commit b856602

File tree

6 files changed

+87
-26
lines changed

6 files changed

+87
-26
lines changed

DependencyInjection/FrameworkExtension.php

Lines changed: 25 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1774,18 +1774,27 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
17741774
$container->setAlias('messenger.default_serializer', $config['serializer']['default_serializer']);
17751775
}
17761776

1777-
$senderAliases = [];
1777+
$senderReferences = [];
1778+
$syncTransports = [];
17781779
$transportRetryReferences = [];
17791780
foreach ($config['transports'] as $name => $transport) {
17801781
$serializerId = $transport['serializer'] ?? 'messenger.default_serializer';
17811782

1782-
$transportDefinition = (new Definition(TransportInterface::class))
1783-
->setFactory([new Reference('messenger.transport_factory'), 'createTransport'])
1784-
->setArguments([$transport['dsn'], $transport['options'] + ['transport_name' => $name], new Reference($serializerId)])
1785-
->addTag('messenger.receiver', ['alias' => $name])
1786-
;
1787-
$container->setDefinition($transportId = 'messenger.transport.'.$name, $transportDefinition);
1788-
$senderAliases[$name] = $transportId;
1783+
if (0 === strpos($transport['dsn'], 'sync://')) {
1784+
$syncTransports[] = $name;
1785+
} else {
1786+
$transportDefinition = (new Definition(TransportInterface::class))
1787+
->setFactory([new Reference('messenger.transport_factory'), 'createTransport'])
1788+
->setArguments([$transport['dsn'], $transport['options'] + ['transport_name' => $name], new Reference($serializerId)])
1789+
->addTag('messenger.receiver', ['alias' => $name])
1790+
;
1791+
$container->setDefinition($transportId = 'messenger.transport.'.$name, $transportDefinition);
1792+
1793+
// alias => service_id
1794+
$senderReferences[$name] = new Reference($transportId);
1795+
// service_id => service_id
1796+
$senderReferences[$transportId] = new Reference($transportId);
1797+
}
17891798

17901799
if (null !== $transport['retry_strategy']['service']) {
17911800
$transportRetryReferences[$name] = new Reference($transport['retry_strategy']['service']);
@@ -1803,30 +1812,25 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
18031812
}
18041813
}
18051814

1806-
$senderReferences = [];
1807-
// alias => service_id
1808-
foreach ($senderAliases as $alias => $serviceId) {
1809-
$senderReferences[$alias] = new Reference($serviceId);
1810-
}
1811-
// service_id => service_id
1812-
foreach ($senderAliases as $serviceId) {
1813-
$senderReferences[$serviceId] = new Reference($serviceId);
1814-
}
1815-
18161815
$messageToSendersMapping = [];
18171816
foreach ($config['routing'] as $message => $messageConfiguration) {
18181817
if ('*' !== $message && !class_exists($message) && !interface_exists($message, false)) {
18191818
throw new LogicException(sprintf('Invalid Messenger routing configuration: class or interface "%s" not found.', $message));
18201819
}
18211820

1822-
// make sure senderAliases contains all senders
1821+
// filter out "sync" senders
1822+
$realSenders = [];
18231823
foreach ($messageConfiguration['senders'] as $sender) {
1824-
if (!isset($senderReferences[$sender])) {
1824+
if (isset($senderReferences[$sender])) {
1825+
$realSenders[] = $sender;
1826+
} elseif (!\in_array($sender, $syncTransports, true)) {
18251827
throw new LogicException(sprintf('Invalid Messenger routing configuration: the "%s" class is being routed to a sender called "%s". This is not a valid transport or service id.', $message, $sender));
18261828
}
18271829
}
18281830

1829-
$messageToSendersMapping[$message] = $messageConfiguration['senders'];
1831+
if ($realSenders) {
1832+
$messageToSendersMapping[$message] = $realSenders;
1833+
}
18301834
}
18311835

18321836
$container->getDefinition('messenger.senders_locator')

Resources/config/messenger.xml

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,11 +73,6 @@
7373
<tag name="messenger.transport_factory" />
7474
</service>
7575

76-
<service id="messenger.transport.sync.factory" class="Symfony\Component\Messenger\Transport\Sync\SyncTransportFactory">
77-
<tag name="messenger.transport_factory" />
78-
<argument type="service" id="messenger.routable_message_bus" />
79-
</service>
80-
8176
<service id="messenger.transport.in_memory.factory" class="Symfony\Component\Messenger\Transport\InMemoryTransportFactory">
8277
<tag name="messenger.transport_factory" />
8378
<tag name="kernel.reset" method="reset" />
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
$container->loadFromExtension('framework', [
4+
'messenger' => [
5+
'transports' => [
6+
'amqp' => 'amqp://localhost/%2f/messages',
7+
'sync' => 'sync://',
8+
],
9+
'routing' => [
10+
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\DummyMessage' => ['amqp'],
11+
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\SecondMessage' => ['sync'],
12+
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\FooMessage' => ['amqp', 'sync'],
13+
],
14+
],
15+
]);
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
<?xml version="1.0" encoding="utf-8" ?>
2+
<container xmlns="http://symfony.com/schema/dic/services"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xmlns:framework="http://symfony.com/schema/dic/symfony"
5+
xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd
6+
http://symfony.com/schema/dic/symfony https://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
7+
8+
<framework:config>
9+
<framework:messenger>
10+
<framework:routing message-class="Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\DummyMessage">
11+
<framework:sender service="amqp" />
12+
</framework:routing>
13+
<framework:routing message-class="Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\SecondMessage">
14+
<framework:sender service="sync" />
15+
</framework:routing>
16+
<framework:routing message-class="Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\FooMessage">
17+
<framework:sender service="amqp" />
18+
<framework:sender service="sync" />
19+
</framework:routing>
20+
<framework:transport name="amqp" dsn="amqp://localhost/%2f/messages" />
21+
<framework:transport name="sync" dsn="sync://" />
22+
</framework:messenger>
23+
</framework:config>
24+
</container>
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
framework:
2+
messenger:
3+
transports:
4+
amqp: 'amqp://localhost/%2f/messages'
5+
sync: 'sync://'
6+
7+
routing:
8+
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\DummyMessage': amqp
9+
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\SecondMessage': sync
10+
'Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\FooMessage': [amqp, sync]

Tests/DependencyInjection/FrameworkExtensionTest.php

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
use Symfony\Bundle\FrameworkBundle\DependencyInjection\Compiler\AddAnnotationsCachedReaderPass;
1717
use Symfony\Bundle\FrameworkBundle\DependencyInjection\FrameworkExtension;
1818
use Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\DummyMessage;
19+
use Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\FooMessage;
20+
use Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\SecondMessage;
1921
use Symfony\Bundle\FrameworkBundle\Tests\TestCase;
2022
use Symfony\Bundle\FullStack;
2123
use Symfony\Component\Cache\Adapter\AdapterInterface;
@@ -780,6 +782,17 @@ public function testMessengerInvalidTransportRouting()
780782
$this->createContainerFromFile('messenger_routing_invalid_transport');
781783
}
782784

785+
public function testMessengerSyncTransport()
786+
{
787+
$container = $this->createContainerFromFile('messenger_sync_transport');
788+
$senderLocatorDefinition = $container->getDefinition('messenger.senders_locator');
789+
790+
$sendersMapping = $senderLocatorDefinition->getArgument(0);
791+
$this->assertEquals(['amqp'], $sendersMapping[DummyMessage::class]);
792+
$this->assertArrayNotHasKey(SecondMessage::class, $sendersMapping);
793+
$this->assertEquals(['amqp'], $sendersMapping[FooMessage::class]);
794+
}
795+
783796
public function testTranslator()
784797
{
785798
$container = $this->createContainerFromFile('full');

0 commit comments

Comments
 (0)