Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit9bb50fb

Browse files
committed
[Messenger] New transport.serializer configuration
1 parentc05bd6c commit9bb50fb

File tree

24 files changed

+700
-2
lines changed

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(staticfn (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(staticfn (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(staticfn (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(staticfn ($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(staticfn (array$incomingMessageConf) => !(isset($incomingMessageConf['messageClass'])xorisset($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
useSymfony\Component\Messenger\MessageBus;
121121
useSymfony\Component\Messenger\MessageBusInterface;
122122
useSymfony\Component\Messenger\Middleware\RouterContextMiddleware;
123+
useSymfony\Component\Messenger\Transport\Serialization\IncomingMessageSerializer;
124+
useSymfony\Component\Messenger\Transport\Serialization\OutgoingMessageSerializer;
125+
useSymfony\Component\Messenger\Transport\Serialization\Serializer;
123126
useSymfony\Component\Messenger\Transport\Serialization\SerializerInterface;
124127
useSymfony\Component\Messenger\Transport\TransportFactoryInterface;
125128
useSymfony\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 = (newDefinition(Serializer::class))
2099+
->setArguments([
2100+
newReference($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 = (newDefinition(IncomingMessageSerializer::class))
2111+
->setArguments([
2112+
$incomingSerializerConf['messageClass'] ??newReference($incomingSerializerConf['messageClassResolver']),
2113+
newReference($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 = (newDefinition(OutgoingMessageSerializer::class))
2123+
->setArguments([
2124+
newReference($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 = (newDefinition(TransportInterface::class))
20912134
->setFactory([newReference('messenger.transport_factory'),'createTransport'])
20922135
->setArguments([$transport['dsn'],$transport['options'] + ['transport_name' =>$name],newReference($serializerId)])
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,64 @@
1+
<?php
2+
3+
useSymfony\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+
useSymfony\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+
<containerxmlns="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:confighttp-method-override="false">
10+
<framework:serializerenabled="true" />
11+
<framework:messenger>
12+
<framework:serializer>
13+
<framework:symfony-serializerformat="xml">
14+
<framework:context>
15+
<framework:default>context</framework:default>
16+
</framework:context>
17+
</framework:symfony-serializer>
18+
</framework:serializer>
19+
20+
<framework:transportname="default_serializer"dsn="null://" />
21+
22+
<framework:transportname="custom_serializer_short_notation"dsn="null://"serializer="messenger.transport.native_php_serializer" />
23+
24+
<framework:transportname="custom_serializer_long_notation"dsn="null://">
25+
<framework:serializerservice_id="messenger.transport.native_php_serializer" />
26+
</framework:transport>
27+
28+
<framework:transportname="symfony_serializer_with_context"dsn="null://">
29+
<framework:serializerformat="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:transportname="incoming_message_transport"dsn="null://">
37+
<framework:incoming_message_serializerformat="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:transportname="incoming_message_transport_with_default_serializer"dsn="null://">
45+
<framework:incoming_message_serializermessageClassResolver="some_message_class_resolver_id" />
46+
</framework:transport>
47+
48+
<framework:transportname="outgoing_message_transport"dsn="null://">
49+
<framework:outgoing_message_serializerformat="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:transportname="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+
<containerxmlns="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:confighttp-method-override="false">
10+
<framework:serializerenabled="true" />
11+
<framework:messenger>
12+
<framework:transportname="invalid_transport"dsn="null://">
13+
<framework:serializerservice_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)

[8]ページ先頭

©2009-2025 Movatter.jp