8000 Making the serializer configurable by transport · symfony/symfony@79425a3 · GitHub
[go: up one dir, main page]

Skip to content

Commit 79425a3

Browse files
committed
Making the serializer configurable by transport
1 parent 6fdc1b4 commit 79425a3

16 files changed

+38
-104
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1095,6 +1095,7 @@ function ($a) {
10951095
->fixXmlConfig('option')
10961096
->children()
10971097
->scalarNode('dsn')->end()
1098+
->scalarNode('serializer')->defaultNull()->info('Service id of a custom serializer to use.')->end()
10981099
->arrayNode('options')
10991100
->normalizeKeys(false)
11001101
->defaultValue([])

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

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,6 @@
7575
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
7676
use Symfony\Component\Messenger\MessageBus;
7777
use Symfony\Component\Messenger\MessageBusInterface;
78-
use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface;
7978
use Symfony\Component\Messenger\Transport\TransportFactoryInterface;
8079
use Symfony\Component\Messenger\Transport\TransportInterface;
8180
use Symfony\Component\Mime\MimeTypeGuesserInterface;
@@ -1587,22 +1586,10 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
15871586
$container->removeDefinition('messenger.transport.symfony_serializer');
15881587
$container->removeDefinition('messenger.transport.amqp.factory');
15891588
} else {
1590-
if ('messenger.transport.symfony_serializer' === $config['serializer']['id']) {
1591-
if (!$this->isConfigEnabled($container, $serializerConfig)) {
1592-
throw new LogicException('The Messenger serializer cannot be enabled as the Serializer support is not available. Try enabling it or running "composer require symfony/serializer-pack".');
1593-
}
1594-
1595-
$container->getDefinition('messenger.transport.symfony_serializer')
1596-
->replaceArgument(1, $config['serializer']['format'])
1597-
->replaceArgument(2, $config['serializer']['context']);
1598-
}
1599-
1600-
if ($config['serializer']['id']) {
1601-
$container->setAlias('messenger.transport.serializer', $config['serializer']['id']);
1602-
} else {
1603-
$container->removeDefinition('messenger.transport.amqp.factory');
1604-
$container->removeDefinition(SerializerInterface::class);
1605-
}
1589+
$container->getDefinition('messenger.transport.symfony_serializer')
1590+
->replaceArgument(1, $config['serializer']['format'])
1591+
->replaceArgument(2, $config['serializer']['context']);
1592+
$container->setAlias('messenger.transport.serializer', $config['serializer']['id']);
16061593
}
16071594

16081595
if (null === $config['default_bus'] && 1 === \count($config['buses'])) {
@@ -1648,8 +1635,8 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
16481635

16491636
$senderAliases = [];
16501637
foreach ($config['transports'] as $name => $transport) {
1651-
if (0 === strpos($transport['dsn'], 'amqp://') && !$container->hasDefinition('messenger.transport.amqp.factory')) {
1652-
throw new LogicException('The default AMQP transport is not available. Make sure you have installed and enabled the Serializer component. Try enabling it or running "composer require symfony/serializer-pack".');
1638+
if (null !== $transport['serializer']) {
1639+
$transport['options']['serializer'] = new Reference($transport['serializer']);
16531640
}
16541641

16551642
$transportDefinition = (new Definition(TransportInterface::class))

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -428,6 +428,7 @@
428428
<xsd:element name="options" type="metadata" minOccurs="0" maxOccurs="unbounded" />
429429
</xsd:sequence>
430430
<xsd:attribute name="name" type="xsd:string" />
431+
<xsd:attribute name="serializer" type="xsd:string" />
431432
<xsd:attribute name="dsn" type="xsd:string" />
432433
</xsd:complexType>
433434

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

Lines changed: 0 additions & 10 deletions
This file was deleted.

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

Lines changed: 0 additions & 13 deletions
This file was deleted.

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
'customised' => [
1010
'dsn' => 'amqp://localhost/%2f/messages?exchange_name=exchange_name',
1111
'options' => ['queue' => ['name' => 'Queue']],
12+
'serializer' => 'messenger.transport.native_php_serializer',
1213
],
1314
],
1415
],

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

Lines changed: 0 additions & 14 deletions
This file was deleted.

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

Lines changed: 0 additions & 15 deletions
This file was deleted.

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
<framework:messenger>
1111
<framework:serializer id="messenger.transport.symfony_serializer" />
1212
<framework:transport name="default" dsn="amqp://localhost/%2f/messages" />
13-
<framework:transport name="customised" dsn="amqp://localhost/%2f/messages?exchange_name=exchange_name">
13+
<framework:transport name="customised" dsn="amqp://localhost/%2f/messages?exchange_name=exchange_name" serializer="messenger.transport.native_php_serializer">
1414
<framework:options>
1515
<framework:queue>
1616
<framework:name>Queue</framework:name>

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

Lines changed: 0 additions & 5 deletions
This file was deleted.

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

Lines changed: 0 additions & 7 deletions
This file was deleted.

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,4 @@ framework:
99
options:
1010
queue:
1111
name: Queue
12+
serializer: 'messenger.transport.native_php_serializer'

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

Lines changed: 1 addition & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -645,7 +645,7 @@ public function testMessengerTransports()
645645
$this->assertEquals([new Reference('messenger.transport_factory'), 'createTransport'], $transportFactory);
646646
$this->assertCount(2, $transportArguments);
647647
$this->assertSame('amqp://localhost/%2f/messages?exchange_name=exchange_name', $transportArguments[0]);
648-
$this->assertSame(['queue' => ['name' => 'Queue']], $transportArguments[1]);
648+
$this->assertEquals(['queue' => ['name' => 'Queue'], 'serializer' => new Reference('messenger.transport.native_php_serializer')], $transportArguments[1]);
649649

650650
$this->assertTrue($container->hasDefinition('messenger.transport.amqp.factory'));
651651
}
@@ -669,24 +669,6 @@ public function testMessengerRouting()
669669
], $sendersMapping[DummyMessage::class]->getValues());
670670
}
671671

672-
/**
673-
* @expectedException \Symfony\Component\DependencyInjection\Exception\LogicException
674-
* @expectedExceptionMessage The Messenger serializer cannot be enabled as the Serializer support is not available. Try enabling it or running "composer require symfony/serializer-pack".
675-
*/
676-
public function testMessengerTransportConfigurationWithoutSerializer()
677-
{
678-
$this->createContainerFromFile('messenger_transport_no_serializer');
679-
}
680-
681-
/**
682-
* @expectedException \Symfony\Component\DependencyInjection\Exception\LogicException
683-
* @expectedExceptionMessage The default AMQP transport is not available. Make sure you have installed and enabled the Serializer component. Try enabling it or running "composer require symfony/serializer-pack".
684-
*/
685-
public function testMessengerAMQPTransportConfigurationWithoutSerializer()
686-
{
687-
$this->createContainerFromFile('messenger_amqp_transport_no_serializer');
688-
}
689-
690672
public function testMessengerTransportConfiguration()
691673
{
692674
$container = $this->createContainerFromFile('messenger_transport');

src/Symfony/Component/Messenger/Tests/Transport/AmqpExt/AmqpTransportFactoryTest.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Symfony\Component\Messenger\Transport\AmqpExt\AmqpTransport;
1616
use Symfony\Component\Messenger\Transport\AmqpExt\AmqpTransportFactory;
1717
use Symfony\Component\Messenger\Transport\AmqpExt\Connection;
18+
use Symfony\Component\Messenger\Transport\Serialization\PhpSerializer;
1819
use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface;
1920

2021
class AmqpTransportFactoryTest extends TestCase
@@ -40,4 +41,18 @@ public function testItCreatesTheTransport()
4041

4142
$this->assertEquals($expectedTransport, $factory->createTransport('amqp://localhost', ['foo' => 'bar']));
4243
}
44+
45+
public function testItCreatesTheTransportWithACustomSerializer()
46+
{
47+
$factory = new AmqpTransportFactory(
48+
$this->createMock(SerializerInterface::class)
49+
);
50+
51+
// make a different serializer than the one above
52+
$serializer = $this->createMock(PhpSerializer::class);
53+
54+
$expectedTransport = new AmqpTransport(Connection::fromDsn('amqp://localhost', ['foo' => 'bar']), $serializer);
55+
56+
$this->assertEquals($expectedTransport, $factory->createTransport('amqp://localhost', ['foo' => 'bar', 'serializer' => $serializer]));
57+
}
4358
}

src/Symfony/Component/Messenger/Transport/AmqpExt/AmqpTransportFactory.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,10 @@ public function __construct(SerializerInterface $serializer = null)
3232

3333
public function createTransport(string $dsn, array $options): TransportInterface
3434
{
35-
return new AmqpTransport(Connection::fromDsn($dsn, $options), $this->serializer);
35+
$serializer = $options['serializer'] ?? $this->serializer;
36+
unset($options['serializer']);
37+
38+
return new AmqpTransport(Connection::fromDsn($dsn, $options), $serializer);
3639
}
3740

3841
public function supports(string $dsn, array $options): bool

src/Symfony/Component/Messenger/Transport/TransportFactoryInterface.php

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,13 @@
2020
*/
2121
interface TransportFactoryInterface
2222
{
23+
/**
24+
* Creates a new transport using the dsn & options.
25+
*
26+
* Options can include anything that's understood by the transport.
27+
* A "serializer" key may be passed to indicate a customer serializer
28+
* object that the transport should use.
29+
*/
2330
public function createTransport(string $dsn, array $options): TransportInterface;
2431

2532
public function supports(string $dsn, array $options): bool;

0 commit comments

Comments
 (0)
0