Skip to content

Commit 8b46346

Browse files
committed
Making the serializer configurable by transport
1 parent c30f462 commit 8b46346

19 files changed

+44
-131
lines changed

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

+1
Original file line numberDiff line numberDiff line change
@@ -1105,6 +1105,7 @@ function ($a) {
11051105
->fixXmlConfig('option')
11061106
->children()
11071107
->scalarNode('dsn')->end()
1108+
->scalarNode('serializer')->defaultNull()->info('Service id of a custom serializer to use.')->end()
11081109
->arrayNode('options')
11091110
->normalizeKeys(false)
11101111
->defaultValue([])

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

+14-26
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,6 @@
7777
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
7878
use Symfony\Component\Messenger\MessageBus;
7979
use Symfony\Component\Messenger\MessageBusInterface;
80-
use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface;
8180
use Symfony\Component\Messenger\Transport\TransportFactoryInterface;
8281
use Symfony\Component\Messenger\Transport\TransportInterface;
8382
use Symfony\Component\Mime\MimeTypeGuesserInterface;
@@ -1592,28 +1591,6 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
15921591

15931592
$loader->load('messenger.xml');
15941593

1595-
if (empty($config['transports'])) {
1596-
$container->removeDefinition('messenger.transport.symfony_serializer');
1597-
$container->removeDefinition('messenger.transport.amqp.factory');
1598-
} else {
1599-
if ('messenger.transport.symfony_serializer' === $config['serializer']['id']) {
1600-
if (!$this->isConfigEnabled($container, $serializerConfig)) {
1601-
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".');
1602-
}
1603-
1604-
$container->getDefinition('messenger.transport.symfony_serializer')
1605-
->replaceArgument(1, $config['serializer']['format'])
1606-
->replaceArgument(2, $config['serializer']['context']);
1607-
}
1608-
1609-
if ($config['serializer']['id']) {
1610-
$container->setAlias('messenger.transport.serializer', $config['serializer']['id']);
1611-
} else {
1612-
$container->removeDefinition('messenger.transport.amqp.factory');
1613-
$container->removeDefinition(SerializerInterface::class);
1614-
}
1615-
}
1616-
16171594
if (null === $config['default_bus'] && 1 === \count($config['buses'])) {
16181595
$config['default_bus'] = key($config['buses']);
16191596
}
@@ -1665,16 +1642,27 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
16651642
}
16661643
}
16671644

1645+
if (empty($config['transports'])) {
1646+
$container->removeDefinition('messenger.transport.symfony_serializer');
1647+
$container->removeDefinition('messenger.transport.amqp.factory');
1648+
} else {
1649+
$container->getDefinition('messenger.transport.symfony_serializer')
1650+
->replaceArgument(1, $config['serializer']['format'])
1651+
->replaceArgument(2, $config['serializer']['context']);
1652+
$container->setAlias('messenger.transport.serializer', $config['serializer']['id']);
1653+
}
1654+
16681655
$senderAliases = [];
16691656
$transportRetryReferences = [];
16701657
foreach ($config['transports'] as $name => $transport) {
1671-
if (0 === strpos($transport['dsn'], 'amqp://') && !$container->hasDefinition('messenger.transport.amqp.factory')) {
1672-
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".');
1658+
if (null !== $transport['serializer']) {
1659+
$transport['options']['serializer'] = new Reference($transport['serializer']);
16731660
}
1661+
$serializerId = null !== $transport['serializer'] ? $transport['serializer'] : 'messenger.transport.serializer';
16741662

16751663
$transportDefinition = (new Definition(TransportInterface::class))
16761664
->setFactory([new Reference('messenger.transport_factory'), 'createTransport'])
1677-
->setArguments([$transport['dsn'], $transport['options']])
1665+
->setArguments([$transport['dsn'], $transport['options'], new Reference($serializerId )])
16781666
->addTag('messenger.receiver', ['alias' => $name])
16791667
;
16801668
$container->setDefinition($transportId = 'messenger.transport.'.$name, $transportDefinition);

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

-1
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@
6464

6565
<service id="messenger.transport.amqp.factory" class="Symfony\Component\Messenger\Transport\AmqpExt\AmqpTransportFactory">
6666
<tag name="messenger.transport_factory" />
67-
<argument type="service" id="messenger.transport.serializer" />
6867
</service>
6968

7069
<!-- retry -->

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

+1
Original file line numberDiff line numberDiff line change
@@ -429,6 +429,7 @@
429429
<xsd:element name="options" type="metadata" minOccurs="0" maxOccurs="unbounded" />
430430
</xsd:sequence>
431431
<xsd:attribute name="name" type="xsd:string" />
432+
<xsd:attribute name="serializer" type="xsd:string" />
432433
<xsd:attribute name="dsn" type="xsd:string" />
433434
</xsd:complexType>
434435

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

-10
This file was deleted.

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

-13
This file was deleted.

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

+1
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

-14
This file was deleted.

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

-15
This file was deleted.

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

+1-1
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

-5
This file was deleted.

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

-7
This file was deleted.

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

+1
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

+6-19
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,8 @@ public function testMessengerTransports()
659659
$this->assertTrue($container->hasDefinition('messenger.transport.default'));
660660
$this->assertTrue($container->getDefinition('messenger.transport.default')->hasTag('messenger.receiver'));
661661
$this->assertEquals([['alias' => 'default']], $container->getDefinition('messenger.transport.default')->getTag('messenger.receiver'));
662+
$transportArguments = $container->getDefinition('messenger.transport.default')->getArguments();
663+
$this->assertEquals(new Reference('messenger.transport.serializer'), $transportArguments[2]);
662664

663665
$this->assertTrue($container->hasDefinition('messenger.transport.customised'));
664666
$transportFactory = $container->getDefinition('messenger.transport.customised')->getFactory();
@@ -667,7 +669,10 @@ public function testMessengerTransports()
667669
$this->assertEquals([new Reference('messenger.transport_factory'), 'createTransport'], $transportFactory);
668670
$this->assertCount(2, $transportArguments);
669671
$this->assertSame('amqp://localhost/%2f/messages?exchange_name=exchange_name', $transportArguments[0]);
670-
$this->assertSame(['queue' => ['name' => 'Queue']], $transportArguments[1]);
672+
$this->assertEquals(['queue' => ['name' => 'Queue']], $transportArguments[1]);
673+
$this->assertEquals(new Reference('messenger.transport.native_php_serializer'), $transportArguments[2]);
674+
675+
671676

672677
$this->assertTrue($container->hasDefinition('messenger.transport.amqp.factory'));
673678
}
@@ -691,24 +696,6 @@ public function testMessengerRouting()
691696
], $sendersMapping[DummyMessage::class]->getValues());
692697
}
693698

694-
/**
695-
* @expectedException \Symfony\Component\DependencyInjection\Exception\LogicException
696-
* @expectedExceptionMessage The Messenger serializer cannot be enabled as the Serializer support is not available. Try enabling it or running "composer require symfony/serializer-pack".
697-
*/
698-
public function testMessengerTransportConfigurationWithoutSerializer()
699-
{
700-
$this->createContainerFromFile('messenger_transport_no_serializer');
701-
}
702-
703-
/**
704-
* @expectedException \Symfony\Component\DependencyInjection\Exception\LogicException
705-
* @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".
706-
*/
707-
public function testMessengerAMQPTransportConfigurationWithoutSerializer()
708-
{
709-
$this->createContainerFromFile('messenger_amqp_transport_no_serializer');
710-
}
711-
712699
public function testMessengerTransportConfiguration()
713700
{
714701
$container = $this->createContainerFromFile('messenger_transport');

src/Symfony/Component/Messenger/CHANGELOG.md

+3-1
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ CHANGELOG
44
4.3.0
55
-----
66

7+
* [BC BREAK] The `TransportFactoryInterface::createTransport()` signature
8+
changed: a required 3rd `SerializerInterface` argument was added.
79
* Added optional parameter `prefetch_count` in connection configuration,
8-
to setup channel prefetch count
10+
to setup channel prefetch count.
911
* New classes: `RoutableMessageBus`, `AddBusNameStampMiddleware`
1012
and `BusNameStamp` were added, which allow you to add a bus identifier
1113
to the `Envelope` then find the correct bus when receiving from

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

+5-7
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,14 @@
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
2122
{
2223
public function testSupportsOnlyAmqpTransports()
2324
{
24-
$factory = new AmqpTransportFactory(
25-
$this->getMockBuilder(SerializerInterface::class)->getMock()
26-
);
25+
$factory = new AmqpTransportFactory();
2726

2827
$this->assertTrue($factory->supports('amqp://localhost', []));
2928
$this->assertFalse($factory->supports('sqs://localhost', []));
@@ -32,12 +31,11 @@ public function testSupportsOnlyAmqpTransports()
3231

3332
public function testItCreatesTheTransport()
3433
{
35-
$factory = new AmqpTransportFactory(
36-
$serializer = $this->getMockBuilder(SerializerInterface::class)->getMock()
37-
);
34+
$factory = new AmqpTransportFactory();
35+
$serializer = $this->createMock(SerializerInterface::class);
3836

3937
$expectedTransport = new AmqpTransport(Connection::fromDsn('amqp://localhost', ['foo' => 'bar']), $serializer);
4038

41-
$this->assertEquals($expectedTransport, $factory->createTransport('amqp://localhost', ['foo' => 'bar']));
39+
$this->assertEquals($expectedTransport, $factory->createTransport('amqp://localhost', ['foo' => 'bar'], $serializer));
4240
}
4341
}

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

+2-9
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,9 @@
2323
*/
2424
class AmqpTransportFactory implements TransportFactoryInterface
2525
{
26-
private $serializer;
27-
28-
public function __construct(SerializerInterface $serializer = null)
29-
{
30-
$this->serializer = $serializer ?? new PhpSerializer();
31-
}
32-
33-
public function createTransport(string $dsn, array $options): TransportInterface
26+
public function createTransport(string $dsn, array $options, SerializerInterface $serializer): TransportInterface
3427
{
35-
return new AmqpTransport(Connection::fromDsn($dsn, $options), $this->serializer);
28+
return new AmqpTransport(Connection::fromDsn($dsn, $options), $serializer);
3629
}
3730

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

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

+3-2
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
namespace Symfony\Component\Messenger\Transport;
1313

1414
use Symfony\Component\Messenger\Exception\InvalidArgumentException;
15+
use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface;
1516

1617
/**
1718
* @author Samuel Roze <samuel.roze@gmail.com>
@@ -30,11 +31,11 @@ public function __construct(iterable $factories)
3031
$this->factories = $factories;
3132
}
3233

33-
public function createTransport(string $dsn, array $options): TransportInterface
34+
public function createTransport(string $dsn, array $options, SerializerInterface $serializer): TransportInterface
3435
{
3536
foreach ($this->factories as $factory) {
3637
if ($factory->supports($dsn, $options)) {
37-
return $factory->createTransport($dsn, $options);
38+
return $factory->createTransport($dsn, $options, $serializer);
3839
}
3940
}
4041

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

+6-1
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,8 @@
1111

1212
namespace Symfony\Component\Messenger\Transport;
1313

14+
use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface;
15+
1416
/**
1517
* Creates a Messenger transport.
1618
*
@@ -20,7 +22,10 @@
2022
*/
2123
interface TransportFactoryInterface
2224
{
23-
public function createTransport(string $dsn, array $options): TransportInterface;
25+
/**
26+
* Creates a new transport using the dsn, options & serializer.
27+
*/
28+
public function createTransport(string $dsn, array $options, SerializerInterface $serializer): TransportInterface;
2429

2530
public function supports(string $dsn, array $options): bool;
2631
}

0 commit comments

Comments
 (0)