8000 [Messenger] Allow to configure the transport · symfony/symfony@1a3f0bb · GitHub
[go: up one dir, main page]

Skip to content

Commit 1a3f0bb

Browse files
committed
[Messenger] Allow to configure the transport
1 parent d2f8df8 commit 1a3f0bb

18 files changed

+173
-17
lines changed

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1008,6 +1008,21 @@ function ($a) {
10081008
->end()
10091009
->end()
10101010
->end()
1011+
->arrayNode('serializer')
1012+
->canBeDisabled()
1013+
->addDefaultsIfNotSet()
1014+
->children()
1015+
->scalarNode('format')->defaultValue('json')->end()
1016+
->arrayNode('context')
1017+
->normalizeKeys(false)
1018+
->useAttributeAsKey('name')
1019+
->defaultValue(array())
1020+
->prototype('variable')->end()
1021+
->end()
1022+
->end()
1023+
->end()
1024+
->scalarNode('encoder')->defaultValue('messenger.transport.serializer')->end()
1025+
->scalarNode('decoder')->defaultValue('messenger.transport.serializer')->end()
10111026
->arrayNode('middlewares')
10121027
->addDefaultsIfNotSet()
10131028
->children()

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

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -273,7 +273,7 @@ public function load(array $configs, ContainerBuilder $container)
273273
}
274274

275275
if ($this->isConfigEnabled($container, $config['messenger'])) {
276-
$this->registerMessengerConfiguration($config['messenger'], $container, $loader);
276+
$this->registerMessengerConfiguration($config['messenger'], $container, $loader, $config['serializer']);
277277
} else {
278278
$container->removeDefinition('console.command.messenger_consume_messages');
279279
}
@@ -1438,14 +1438,29 @@ private function registerLockConfiguration(array $config, ContainerBuilder $cont
14381438
}
14391439
}
14401440

1441-
private function registerMessengerConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader)
1441+
private function registerMessengerConfiguration(array $config, ContainerBuilder $container, XmlFileLoader $loader, array $serializerConfig)
14421442
{
14431443
if (!interface_exists(MessageBusInterface::class)) {
14441444
throw new LogicException('Messenger support cannot be enabled as the Messenger component is not installed.');
14451445
}
14461446

14471447
$loader->load('messenger.xml');
14481448

1449+
if ($this->isConfigEnabled($container, $config['serializer'])) {
1450+
if (count($config['adapters']) > 0 && !$this->isConfigEnabled($container, $serializerConfig)) {
1451+
throw new LogicException('Using the default encoder/decoder, Symfony Messenger requires the Serializer. Enable it or install it by running "composer require symfony/serializer-pack".');
1452+
}
1453+
1454+
$container->getDefinition('messenger.transport.serializer')
1455+
->replaceArgument(1, $config['serializer']['format'])
1456+
->replaceArgument(2, $config['serializer']['context']);
1457+
} else {
1458+
$container->removeDefinition('messenger.transport.serializer');
1459+
}
1460+
1461+
$container->setAlias('messenger.transport.encoder', $config['encoder']);
1462+
$container->setAlias('messenger.transport.decoder', $config['decoder']);
1463+
14491464
$messageToSenderIdsMapping = array();
14501465
foreach ($config['routing'] as $message => $messageConfiguration) {
14511466
$messageToSenderIdsMapping[$message] = $messageConfiguration['senders'];

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

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -43,13 +43,12 @@
4343
</service>
4444

4545
<!-- Message encoding/decoding -->
46-
<service id="messenger.transport.serialize_message_with_type_in_headers" class="Symfony\Component\Messenger\Transport\Serialization\Serializer">
46+
<service id="messenger.transport.serializer" class="Symfony\Component\Messenger\Transport\Serialization\Serializer">
4747
<argument type="service" id="serializer" />
48+
<argument /> <!-- Format -->
49+
<argument type="collection" /> <!-- Context -->
4850
</service>
4951

50-
<service id="messenger.transport.default_encoder" alias="messenger.transport.serialize_message_with_type_in_headers" public="true" />
51-
<service id="messenger.transport.default_decoder" alias="messenger.transport.serialize_message_with_type_in_headers" public="true" />
52-
5352
<!-- Logging & Debug -->
5453
<service id="messenger.middleware.debug.logging" class="Symfony\Component\Messenger\Debug\LoggingMiddleware">
5554
<argument type="service" id="logger" />
@@ -79,8 +78,8 @@
7978
</service>
8079

8180
<service id="messenger.adapter.amqp.factory" class="Symfony\Component\Messenger\Adapter\AmqpExt\AmqpAdapterFactory">
82-
<argument type="service" id="messenger.transport.default_encoder" />
83-
<argument type="service" id="messenger.transport.default_decoder" />
81+
<argument type="service" id="messenger.transport.encoder" />
82+
<argument type="service" id="messenger.transport.decoder" />
8483
<argument>%kernel.debug%</argument>
8584

8685
<tag name="messenger.adapter_factory" />

src/Symfony/Bundle/FrameworkBundle/Resources/config/schema/symfony-1.0.xsd

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,12 +352,23 @@
352352

353353
<xsd:complexType name="messenger">
354354
<xsd:sequence>
355+
<xsd:element name="serializer" type="messenger_serializer" minOccurs="0" />
356+
<xsd:element name="encoder" type="xsd:string" minOccurs="0" />
357+
<xsd:element name="decoder" type="xsd:string" minOccurs="0" />
355358
<xsd:element name="routing" type="messenger_routing" minOccurs="0" maxOccurs="unbounded" />
356359
<xsd:element name="middlewares" type="messenger_middleware" minOccurs="0" maxOccurs="unbounded" />
357360
<xsd:element name="adapter" type="messenger_adapter" minOccurs="0" maxOccurs="unbounded" />
358361
</xsd:sequence>
359362
</xsd:complexType>
360363

364+
<xsd:complexType name="messenger_serializer">
365+
<xsd:sequence>
366+
<xsd:element name="context" type="metadata" minOccurs="0" maxOccurs="unbounded" />
367+
</xsd:sequence>
368+
<xsd:attribute name="format" type="xsd:string" />
369+
<xsd:attribute name="enabled" type="xsd:boolean" />
370+
</xsd:complexType>
371+
361372
<xsd:complexType name="messenger_routing">
362373
<xsd:choice minOccurs="0" maxOccurs="unbounded">
363374
<xsd:element name="sender" type="messenger_routing_sender" />

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

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use Symfony\Component\Config\Definition\Processor;
1919
use Symfony\Component\Lock\Store\SemaphoreStore;
2020
use Symfony\Component\Messenger\MessageBusInterface;
21+
use Symfony\Component\Serializer\Serializer;
2122

2223
class ConfigurationTest extends TestCase
2324
{
@@ -259,6 +260,13 @@ class_exists(SemaphoreStore::class) && SemaphoreStore::isSupported() ? 'semaphor
259260
),
260261
),
261262
'adapters' => array(),
263+
'serializer' => array(
264+
'enabled' => true,
265+
'format' => 'json',
266+
'context' => array(),
267+
),
268+
'encoder' => 'messenger.transport.serializer',
269+
'decoder' => 'messenger.transport.serializer',
262270
),
263271
);
264272
}

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/messenger_adapter.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
<?php
22

33
$container->loadFromExtension('framework', array(
4+
'serializer' => true,
45
'messenger' => array(
56
'adapters' => array(
67
'default' => 'amqp://localhost/%2f/messages',
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
<?php
2+
3+
$container->loadFromExtension('framework', array(
4+
'messenger' => array(
5+
'serializer' => array(
6+
'format' => 'csv',
7+
'context' => array('enable_max_depth' => true),
8+
),
9+
),
10+
));
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
$container->loadFromExtension('framework', array(
4+
'serializer' => array(
5+
'enabled' => false,
6+
),
7+
'messenger' => array(
8+
'serializer' => array(
9+
'enabled' => true,
10+
),
11+
'adapters' => array(
12+
'default' => 'amqp://localhost/%2f/messages',
13+
),
14+
),
15+
));

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/messenger_adapter.xml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
http://symfony.com/schema/dic/symfony http://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
77

88
<framework:config>
9+
<framework:serializer enabled="true" />
910
<framework:messenger>
1011
<framework:adapter name="default" dsn="amqp://localhost/%2f/messages" />
1112
<framework:adapter name="customised" dsn="amqp://localhost/%2f/messages?exchange_name=exchange_name">
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
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 http://symfony.com/schema/dic/services/services-1.0.xsd
6+
http://symfony.com/schema/dic/symfony http://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
7+
8+
<framework:config>
9+
<framework:messenger>
10+
<framework:serializer format="csv">
11+
<framework:context>
12+
<framework:enable_max_depth>true</framework:enable_max_depth>
13+
</framework:context>
14+
</framework:serializer>
15+
</framework:messenger>
16+
</framework:config>
17+
</container>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
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 http://symfony.com/schema/dic/services/services-1.0.xsd
6+
http://symfony.com/schema/dic/symfony http://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
7+
8+
<framework:config>
9+
<framework:serializer enabled="false" />
10+
<framework:messenger>
11+
<framework:serializer enabled="true" />
12+
<framework:adapter name="default" dsn="amqp://localhost/%2f/messages" />
13+
</framework:messenger>
14+
</framework:config>
15+
</container>

src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/messenger_adapter.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
framework:
2+
serializer: true
23
messenger:
34
adapters:
45
default: 'amqp://localhost/%2f/messages'
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
framework:
2+
messenger:
3+
serializer:
4+
format: csv
5+
context:
6+
enable_max_depth: true
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
framework:
2+
serializer:
3+
enabled: false
4+
messenger:
5+
serializer:
6+
enabled: true
7+
adapters:
8+
default: 'amqp://localhost/%2f/messages'

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

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -569,6 +569,27 @@ public function testMessengerAdapter()
569569
$this->assertSame(array('queue_name' => 'Queue'), $receiverArguments[1]);
570570
}
571571

572+
/**
573+
* @expectedException \Symfony\Component\DependencyInjection\Exception\LogicException
574+
* @expectedExceptionMessage Using the default encoder/decoder, Symfony Messenger requires the Serializer. Enable it or install it by running "composer require symfony/serializer-pack".
575+
*/
576+
public function testMessengerTransportConfigurationWithoutSerializer()
577+
{
578+
$this->createContainerFromFile('messenger_transport_no_serializer');
579+
}
580+
581+
public function testMessengerTransportConfiguration()
582+
{
583+
$container = $this->createContainerFromFile('messenger_transport' 48DA );
584+
585+
$this->assertSame('messenger.transport.serializer', (string) $container->getAlias('messenger.transport.encoder'));
586+
$this->assertSame('messenger.transport.serializer', (string) $container->getAlias('messenger.transport.decoder'));
587+
588+
$serializerTransportDefinition = $container->getDefinition('messenger.transport.serializer');
589+
$this->assertSame('csv', $serializerTransportDefinition->getArgument(1));
590+
$this->assertSame(array('enable_max_depth' => true), $serializerTransportDefinition->getArgument(2));
591+
}
592+
572593
public function testTranslator()
573594
{
574595
$container = $this->createContainerFromFile('full');

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

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -53,12 +53,6 @@ public function process(ContainerBuilder $container)
5353
$container->removeDefinition('messenger.middleware.debug.logging');
5454
}
5555

56-
if (!$container->has('serializer')) {
57-
$container->removeDefinition('messenger.transport.serialize_message_with_type_in_headers');
58-
$container->removeAlias('messenger.transport.default_encoder');
59-
$container->removeAlias('messenger.transport.default_decoder');
60-
}
61-
6256
$this->registerReceivers($container);
6357
$this->registerSenders($container);
6458
$this->registerHandlers($container);

src/Symfony/Component/Messenger/Tests/Transport/Serialization/SerializerTest.php

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,21 @@ public function testEncodedIsHavingTheBodyAndTypeHeader()
4444
$this->assertArrayHasKey('type', $encoded['headers']);
4545
$this->assertEquals(DummyMessage::class, $encoded['headers']['type']);
4646
}
47+
48+
public function testUsesTheCustomFormatAndContext()
49+
{
50+
$message = new DummyMessage('Foo');
51+
52+
$serializer = $this->getMockBuilder(SerializerComponent\SerializerInterface::class)->getMock();
53+
$serializer->expects($this->once())->method('serialize')->with($message, 'csv', array('foo' => 'bar'))->willReturn('Yay');
54+
$serializer->expects($this->once())->method('deserialize')->with('Yay', DummyMessage::class, 'csv', array('foo' => 'bar'))->willReturn($message);
55+
56+
$encoder = new Serializer($serializer, 'csv', array('foo' => 'bar'));
57+
58+
$encoded = $encoder->encode($message);
59+
$decoded = $encoder->decode($encoded);
60+
61+
$this->assertSame('Yay', $encoded['body']);
62+
$this->assertSame($message, $decoded);
63+
}
4764
}

src/Symfony/Component/Messenger/Transport/Serialization/Serializer.php

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,11 +20,13 @@ class Serializer implements DecoderInterface, EncoderInterface
2020
{
2121
private $serializer;
2222
private $format;
23+
private $context;
2324

24-
public function __construct(SerializerInterface $serializer, string $format = 'json')
25+
public function __construct(SerializerInterface $serializer, string $format = 'json', array $context = array())
2526
{
2627
$this->serializer = $serializer;
2728
$this->format = $format;
29+
$this->context = $context;
2830
}
2931

3032
/**
@@ -40,7 +42,7 @@ public function decode(array $encodedMessage)
4042
throw new \InvalidArgumentException('Encoded message does not have a `type` header.');
4143
}
4244

43-
return $this->serializer->deserialize($encodedMessage['body'], $encodedMessage['headers']['type'], $this->format);
45+
return $this->serializer->deserialize($encodedMessage['body'], $encodedMessage['headers']['type'], $this->format, $this->context);
4446
}
4547

4648
/**
@@ -49,7 +51,7 @@ public function decode(array $encodedMessage)
4951
public function encode($message): array
5052
{
5153
return array(
52-
'body' => $this->serializer->serialize($message, $this->format),
54+
'body' => $this->serializer->serialize($message, $this->format, $this->context),
5355
'headers' => array('type' => \get_class($message)),
5456
);
5557
}

0 commit comments

Comments
 (0)
0