8000 [Messenger] New transport.serializer configuration · symfony/symfony@9bb50fb · GitHub
[go: up one dir, main page]

Skip to content

Commit 9bb50fb

Browse files
committed
[Messenger] New transport.serializer configuration
1 parent c05bd6c commit 9bb50fb

24 files changed

+700
-2
lines changed

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

Lines changed: 67 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1466,9 +1466,75 @@ function ($a) {
14661466
})
14671467
->end()
14681468
->fixXmlConfig('option')
1469+
->validate()
1470+
->ifTrue(static fn (array $transportConf) => \count(array_intersect(['serializer', 'incoming_message_serializer', 'outgoing_message_serializer'], array_keys($transportConf))) > 1)
1471+
->thenInvalid('Only one of "serializer", "incoming_message_serializer" and "outgoing_message_serializer" could be used.')
1472+
->end()
14691473
->children()
14701474
->scalarNode('dsn')->end()
1471-
->scalarNode('serializer')->defaultNull()->info('Service id of a custom serializer to use.')->end()
1475+
->arrayNode('serializer')
1476+
->info('Transport serializer configuration for messages produced and handled by this application.')
1477+
->beforeNormalization()
1478+
->ifString()
1479+
->then(static fn (string $serviceId) => ['service_id' => $serviceId])
1480+
->end()
1481+
->children()
1482+
->scalarNode('service_id')->info('Service id of a custom transport serializer to use (incompatible with "format", "context" and "serializer" options).')->defaultNull()->end()
1483+
->scalarNode('format')->info('Serialization format for this transport\'s serializer (will use Symfony serializer).')->end()
1484+
->arrayNode('context')
1485+
->normalizeKeys(false)
1486+
->useAttributeAsKey('name')
1487+
->defaultValue([])
1488+
->info('Context serialization array for this transport\'s serializer (will use Symfony serializer).')
1489+
->prototype('variable')->end()
1490+
->end()
1491+
->scalarNode('serializer')->info('Service id of a custom Symfony serializer to use.')->end()
1492+
->end()
1493+
->validate()
1494+
->ifTrue(static fn (array $serializerConf) => !(isset($serializerConf['service_id']) xor (isset($serializerConf['format']) || [] !== $serializerConf['context'] || isset($serializerConf['serializer']))))
1495+
->thenInvalid('Either "service_id" OR at least one of "format" or "context" or "serializer" should be provided.')
1496+
->end()
1497+
->end()
1498+
->arrayNode('incoming_message_serializer')
1499+
->info('Transport serializer configuration for messages coming from other applications (uses Symfony serializer).')
1500+
->children()
1501+
->scalarNode('messageClass')
1502+
->info('The class in which the message should be deserialized (incompatible with "messageClassResolver" option).')
1503+
->validate()
1504+
->ifTrue(static fn ($class) => $class && !class_exists($class))
1505+
->thenInvalid('The "messageClass" should be a valid class.')
1506+
->end()
1507+
->end()
1508+
->scalarNode('messageClassResolver')->info('Service id of a message class resolver to use (incompatible with "messageClass" option).')->end()
1509+
->scalarNode('format')->info('Serialization format for this transport\'s serializer.')->end()
1510+
->arrayNode('context')
1511+
->normalizeKeys(false)
1512+
->useAttributeAsKey('name')
1513+
->defaultValue([])
1514+
->info('Context serialization array for this transport\'s serializer.')
1515+
->prototype('variable')->end()
1516+
->end()
1517+
->scalarNode('serializer')->info('Service id of a custom Symfony serializer to use.')->end()
1518+
->end()
1519+
->validate()
1520+
->ifTrue(static fn (array $incomingMessageConf) => !(isset($incomingMessageConf['messageClass']) xor isset($incomingMessageConf['messageClassResolver'])))
1521+
->thenInvalid('A message class OR a message class resolver should be provided.')
1522+
->end()
1523+
->end()
1524+
->arrayNode('outgoing_message_serializer')
1525+
->info('Transport serializer configuration for sending messages to other applications (uses Symfony serializer).')
1526+
->children()
1527+
->scalarNode('format')->info('Serialization format for this transport\'s serializer.')->end()
1528+
->arrayNode('context')
1529+
->normalizeKeys(false)
1530+
->useAttributeAsKey('name')
1531+
->defaultValue([])
1532+
->info('Context serialization array for this transport\'s serializer.')
1533+
->prototype('variable')->end()
1534+
->end()
1535+
->scalarNode('serializer')->info('Service id of a custom Symfony serializer to use.')->end()
1536+
->end()
1537+
->end()
14721538
->arrayNode('options')
14731539
->normalizeKeys(false)
14741540
->defaultValue([])

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

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,9 @@
120120
use Symfony\Component\Messenger\MessageBus;
121121
use Symfony\Component\Messenger\MessageBusInterface;
122122
use Symfony\Component\Messenger\Middleware\RouterContextMiddleware;
123+
use Symfony\Component\Messenger\Transport\Serialization\IncomingMessageSerializer;
124+
use Symfony\Component\Messenger\Transport\Serialization\OutgoingMessageSerializer;
125+
use Symfony\Component\Messenger\Transport\Serialization\Serializer;
123126
use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface;
124127
use Symfony\Component\Messenger\Transport\TransportFactoryInterface;
125128
use Symfony\Component\Messenger\Transport\TransportInterface;
@@ -2086,7 +2089,47 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
20862089
$transportRetryReferences = [];
20872090
$transportRateLimiterReferences = [];
20882091
foreach ($config['transports'] as $name => $transport) {
2089-
$serializerId = $transport['serializer'] ?? 'messenger.default_serializer';
2092+
if (isset($transport['serializer'])) {
2093+
$basicSerializerConf = $transport['serializer'];
2094+
2095+
$serializerId = $basicSerializerConf['service_id'] ?? "messenger.transport.{$name}.serializer";
2096+
2097+
if (($basicSerializerConf['serializer'] ?? null) || ($basicSerializerConf['format'] ?? null) || [] !== $basicSerializerConf['context']) {
2098+
$serializerDefinition = (new Definition(Serializer::class))
2099+
->setArguments([
2100+
new Reference($basicSerializerConf['serializer'] ?? 'serializer'),
2101+
$basicSerializerConf['format'] ?? $config['serializer']['symfony_serializer']['format'],
2102+
$basicSerializerConf['context'] ?: $config['serializer']['symfony_serializer']['context'],
2103+
]);
2104+
2105+
$container->setDefinition($serializerId, $serializerDefinition);
2106+
}
2107+
} elseif (isset($transport['incoming_message_serializer'])) {
2108+
$incomingSerializerConf = $transport['incoming_message_serializer'];
2109+
2110+
$serializerDefinition = (new Definition(IncomingMessageSerializer::class))
2111+
->setArguments([
2112+
$incomingSerializerConf['messageClass'] ?? new Reference($incomingSerializerConf['messageClassResolver']),
2113+
new Reference($incomingSerializerConf['serializer'] ?? 'serializer'),
2114+
$incomingSerializerConf['format'] ?? $config['serializer']['symfony_serializer']['format'],
2115+
$incomingSerializerConf['context'] ?: $config['serializer']['symfony_serializer']['context'],
2116+
]);
2117+
2118+
$container->setDefinition($serializerId = "messenger.transport.{$name}.serializer", $serializerDefinition);
2119+
} elseif (isset($transport['outgoing_message_serializer'])) {
2120+
$outgoingSerializerConf = $transport['outgoing_message_serializer'];
2121+
2122+
$serializerDefinition = (new Definition(OutgoingMessageSerializer::class))
2123+
->setArguments([
2124+
new Reference($outgoingSerializerConf['serializer'] ?? 'serializer'),
2125+
$outgoingSerializerConf['format'] ?? $config['serializer']['symfony_serializer']['format'],
2126+
$outgoingSerializerConf['context'] ?: $config['serializer']['symfony_serializer']['context'],
2127+
]);
2128+
2129+
$container->setDefinition($serializerId = "messenger.transport.{$name}.serializer", $serializerDefinition);
2130+
}
2131+
2132+
$serializerId ??= 'messenger.default_serializer';
20902133
$transportDefinition = (new Definition(TransportInterface::class))
20912134
->setFactory([new Reference('messenger.transport_factory'), 'createTransport'])
20922135
->setArguments([$transport['dsn'], $transport['options'] + ['transport_name' => $name], new Reference($serializerId)])
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<?php
2+
3+
use Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\BarMessage;
4+
5+
$container->loadFromExtension('framework', [
6+
'http_method_override' => false,
7+
'serializer' => true,
8+
'messenger' => [
9+
'serializer' => [
10+
'symfony_serializer' => [
11+
'format' => 'xml',
12+
'context' => ['default' => 'context'],
13+
]
14+
],
15+
'transports' => [
16+
'default_serializer' => ['dsn' => 'null://'],
17+
'custom_serializer_short_notation' => [
18+
'dsn' => 'null://',
19+
'serializer' => 'messenger.transport.native_php_serializer',
20+
],
21+
'custom_serializer_long_notation' => [
22+
'dsn' => 'null://',
23+
'serializer' => [
24+
'service_id' => 'messenger.transport.native_php_serializer',
25+
],
26+
],
27+
'symfony_serializer_with_context' => [
28+
'dsn' => 'null://',
29+
'serializer' => [
30+
'format' => 'json',
31+
'context' => ['some' => 'context'],
32+
'serializer' => 'my_fancy_serializer',
33+
],
34+
],
35+
'incoming_message_transport' => [
36+
'dsn' => 'null://',
37+
'incoming_message_serializer' => [
38+
'messageClass' => BarMessage::class,
39+
'format' => 'json',
40+
'context' => ['some' => 'context'],
41+
'serializer' => 'my_fancy_serializer',
42+
],
43+
],
44+
'incoming_message_transport_with_default_serializer' => [
45+
'dsn' => 'null://',
46+
'incoming_message_serializer' => [
47+
'messageClassResolver' => 'some_message_class_resolver_id',
48+
],
49+
],
50+
'outgoing_message_transport' => [
51+
'dsn' => 'null://',
52+
'outgoing_message_serializer' => [
53+
'format' => 'json',
54+
'context' => ['some' => 'context'],
55+
'serializer' => 'my_fancy_serializer',
56+
],
57+
],
58+
'outgoing_message_transport_with_default_serializer' => [
59+
'dsn' => 'null://',
60+
'outgoing_message_serializer' => [],
61+
],
62+
],
63+
],
64+
]);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
$container->loadFromExtension('framework', [
4+
'http_method_override' => false,
5+
'serializer' => true,
6+
'messenger' => [
7+
'transports' => [
8+
'invalid_transport' => [
9+
'dsn' => 'null://',
10+
'serializer' => 'messenger.transport.native_php_serializer',
11+
'outgoing_message_serializer' => []
12+
]
13+
],
14+
],
15+
]);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
<?php
2+
3+
$container->loadFromExtension('framework', [
4+
'http_method_override' => false,
5+
'serializer' => true,
6+
'messenger' => [
7+
'transports' => [
8+
'invalid_transport' => [
9+
'dsn' => 'null://',
10+
'serializer' => [
11+
'service_id' => 'messenger.transport.native_php_serializer',
12+
'format' => 'json'
13+
],
14+
]
15+
],
16+
],
17+
]);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
$container->loadFromExtension('framework', [
4+
'http_method_override' => false,
5+
'serializer' => true,
6+
'messenger' => [
7+
'transports' => [
8+
'invalid_transport' => [
9+
'dsn' => 'null://',
10+
'serializer' => [],
11+
]
12+
],
13+
],
14+
]);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
use Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\BarMessage;
4+
5+
$container->loadFromExtension('framework', [
6+
'http_method_override' => false,
7+
'serializer' => true,
8+
'messenger' => [
9+
'transports' => [
10+
'invalid_transport' => [
11+
'dsn' => 'null://',
12+
'incoming_message_serializer' => [
13+
'messageClass' => BarMessage::class,
14+
'messageClassResolver' => 'foo',
15+
],
16+
]
17+
],
18+
],
19+
]);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
<?php
2+
3+
$container->loadFromExtension('framework', [
4+
'http_method_override' => false,
5+
'serializer' => true,
6+
'messenger' => [
7+
'transports' => [
8+
'invalid_transport' => [
9+
'dsn' => 'null://',
10+
'incoming_message_serializer' => [
11+
'messageClass' => 'foo',
12+
],
13+
]
14+
],
15+
],
16+
]);
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
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+
9+
<framework:config http-method-override="false">
10+
<framework:serializer enabled="true" />
11+
<framework:messenger>
12+
<framework:serializer>
13+
<framework:symfony-serializer format="xml">
14+
<framework:context>
15+
<framework:default>context</framework:default>
16+
</framework:context>
17+
</framework:symfony-serializer>
18+
</framework:serializer>
19+
20+
<framework:transport name="default_serializer" dsn="null://" />
21+
22+
<framework:transport name="custom_serializer_short_notation" dsn="null://" serializer="messenger.transport.native_php_serializer" />
23+
24+
<framework:transport name="custom_serializer_long_notation" dsn="null://">
25+
<framework:serializer service_id="messenger.transport.native_php_serializer" />
26+
</framework:transport>
27+
28+
<framework:transport name="symfony_serializer_with_context" dsn="null://">
29+
<framework:serializer format="json" serializer="my_fancy_serializer">
30+
<framework:context>
31+
<framework:some>context</framework:some>
32+
</framework:context>
33+
</framework:serializer>
34+
</framework:transport>
35+
36+
<framework:transport name="incoming_message_transport" dsn="null://">
37+
<framework:incoming_message_serializer format="json" serializer="my_fancy_serializer" messageClass="Symfony\Bundle\FrameworkBundle\Tests\Fixtures\Messenger\BarMessage">
38+
<framework:context>
39+
<framework:some>context</framework:some>
40+
</framework:context>
41+
</framework:incoming_message_serializer>
42+
</framework:transport>
43+
44+
<framework:transport name="incoming_message_transport_with_default_serializer" dsn="null://">
45+
<framework:incoming_message_serializer messageClassResolver="some_message_class_resolver_id" />
46+
</framework:transport>
47+
48+
<framework:transport name="outgoing_message_transport" dsn="null://">
49+
<framework:outgoing_message_serializer format="json" serializer="my_fancy_serializer">
50+
<framework:context>
51+
<framework:some>context</framework:some>
52+
</framework:context>
53+
</framework:outgoing_message_serializer>
54+
</framework:transport>
55+
56+
<framework:transport name="outgoing_message_transport_with_default_serializer" dsn="null://">
57+
<framework:outgoing_message_serializer />
58+
</framework:transport>
59+
60+
</framework:messenger>
61+
</framework:config>
62+
</container>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
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+
9+
<framework:config http-method-override="false">
10+
<framework:serializer enabled="true" />
11+
<framework:messenger>
12+
<framework:transport name="invalid_transport" dsn="null://">
13+
<framework:serializer service_id="messenger.transport.native_php_serializer" />
14+
<framework:outgoing_message_serializer />
15+
</framework:transport>
16+
</framework:messenger>
17+
</framework:config>
18+
</container>

0 commit comments

Comments
 (0)
0