Skip to content

Commit 4feff54

Browse files
committed
Making the serializer configurable by transport
1 parent 0727664 commit 4feff54

19 files changed

+41
-132
lines changed

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1146,6 +1146,7 @@ function ($a) {
11461146
->fixXmlConfig('option')
11471147
->children()
11481148
->scalarNode('dsn')->end()
1149+
->scalarNode('serializer')->defaultNull()->info('Service id of a custom serializer to use.')->end()
11491150
->arrayNode('options')
11501151
->normalizeKeys(false)
11511152
->defaultValue([])

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

Lines changed: 14 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@
7878
use Symfony\Component\Messenger\Handler\MessageHandlerInterface;
7979
use Symfony\Component\Messenger\MessageBus;
8080
use Symfony\Component\Messenger\MessageBusInterface;
81-
use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface;
8281
use Symfony\Component\Messenger\Transport\TransportFactoryInterface;
8382
use Symfony\Component\Messenger\Transport\TransportInterface;
8483
use Symfony\Component\Mime\MimeTypeGuesserInterface;
@@ -1604,28 +1603,6 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
16041603

16051604
$loader->load('messenger.xml');
16061605

1607-
if (empty($config['transports'])) {
1608-
$container->removeDefinition('messenger.transport.symfony_serializer');
1609-
$container->removeDefinition('messenger.transport.amqp.factory');
1610-
} else {
1611-
if ('messenger.transport.symfony_serializer' === $config['serializer']['id']) {
1612-
if (!$this->isConfigEnabled($container, $serializerConfig)) {
1613-
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".');
1614-
}
1615-
1616-
$container->getDefinition('messenger.transport.symfony_serializer')
1617-
->replaceArgument(1, $config['serializer']['format'])
1618-
->replaceArgument(2, $config['serializer']['context']);
1619-
}
1620-
1621-
if ($config['serializer']['id']) {
1622-
$container->setAlias('messenger.transport.serializer', $config['serializer']['id']);
1623-
} else {
1624-
$container->removeDefinition('messenger.transport.amqp.factory');
1625-
$container->removeDefinition(SerializerInterface::class);
1626-
}
1627-
}
1628-
16291606
if (null === $config['default_bus'] && 1 === \count($config['buses'])) {
16301607
$config['default_bus'] = key($config['buses']);
16311608
}
@@ -1677,16 +1654,27 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
16771654
}
16781655
}
16791656

1657+
if (empty($config['transports'])) {
1658+
$container->removeDefinition('messenger.transport.symfony_serializer');
1659+
$container->removeDefinition('messenger.transport.amqp.factory');
1660+
} else {
1661+
$container->getDefinition('messenger.transport.symfony_serializer')
1662+
->replaceArgument(1, $config['serializer']['format'])
1663+
->replaceArgument(2, $config['serializer']['context']);
1664+
$container->setAlias('messenger.transport.serializer', $config['serializer']['id']);
1665+
}
1666+
16801667
$senderAliases = [];
16811668
$transportRetryReferences = [];
16821669
foreach ($config['transports'] as $name => $transport) {
1683-
if (0 === strpos($transport['dsn'], 'amqp://') && !$container->hasDefinition('messenger.transport.amqp.factory')) {
1684-
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".');
1670+
if (null !== $transport['serializer']) {
1671+
$transport['options']['serializer'] = new Reference($transport['serializer']);
16851672
}
1673+
$serializerId = null !== $transport['serializer'] ? $transport['serializer'] : 'messenger.transport.serializer';
16861674

16871675
$transportDefinition = (new Definition(TransportInterface::class))
16881676
->setFactory([new Reference('messenger.transport_factory'), 'createTransport'])
1689-
->setArguments([$transport['dsn'], $transport['options']])
1677+
->setArguments([$transport['dsn'], $transport['options'], new Reference($serializerId)])
16901678
->addTag('messenger.receiver', ['alias' => $name])
16911679
;
16921680
$container->setDefinition($transportId = 'messenger.transport.'.$name, $transportDefinition);

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

Lines changed: 0 additions & 1 deletion
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
<service id="messenger.transport.sync.factory" class="Symfony\Component\Messenger\Transport\Sync\SyncTransportFactory">

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
@@ -437,6 +437,7 @@
437437
<xsd:element name="options" type="metadata" minOccurs="0" maxOccurs="unbounded" />
438438
</xsd:sequence>
439439
<xsd:attribute name="name" type="xsd:string" />
440+
<xsd:attribute name="serializer" type="xsd:string" />
440441
<xsd:attribute name="dsn" type="xsd:string" />
441442
</xsd:complexType>
442443

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: 4 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -661,6 +661,8 @@ public function testMessengerTransports()
661661
$this->assertTrue($container->hasDefinition('messenger.transport.default'));
662662
$this->assertTrue($container->getDefinition('messenger.transport.default')->hasTag('messenger.receiver'));
663663
$this->assertEquals([['alias' => 'default']], $container->getDefinition('messenger.transport.default')->getTag('messenger.receiver'));
664+
$transportArguments = $container->getDefinition('messenger.transport.default')->getArguments();
665+
$this->assertEquals(new Reference('messenger.transport.serializer'), $transportArguments[2]);
664666

665667
$this->assertTrue($container->hasDefinition('messenger.transport.customised'));
666668
$transportFactory = $container->getDefinition('messenger.transport.customised')->getFactory();
@@ -669,7 +671,8 @@ public function testMessengerTransports()
669671
$this->assertEquals([new Reference('messenger.transport_factory'), 'createTransport'], $transportFactory);
670672
$this->assertCount(2, $transportArguments);
671673
$this->assertSame('amqp://localhost/%2f/messages?exchange_name=exchange_name', $transportArguments[0]);
672-
$this->assertSame(['queue' => ['name' => 'Queue']], $transportArguments[1]);
674+
$this->assertEquals(['queue' => ['name' => 'Queue']], $transportArguments[1]);
675+
$this->assertEquals(new Reference('messenger.transport.native_php_serializer'), $transportArguments[2]);
673676

674677
$this->assertTrue($container->hasDefinition('messenger.transport.amqp.factory'));
675678
}
@@ -693,24 +696,6 @@ public function testMessengerRouting()
693696
], $sendersMapping[DummyMessage::class]->getValues());
694697
}
695698

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

src/Symfony/Component/Messenger/CHANGELOG.md

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@ 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 a new `SyncTransport` along with `ForceCallHandlersStamp` to
810
explicitly handle messages synchronously.
911
* Added optional parameter `prefetch_count` in connection configuration,
10-
to setup channel prefetch count
12+
to setup channel prefetch count.
1113
* New classes: `RoutableMessageBus`, `AddBusNameStampMiddleware`
1214
and `BusNameStamp` were added, which allow you to add a bus identifier
1315
to the `Envelope` then find the correct bus when receiving from

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

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,7 @@ class AmqpTransportFactoryTest extends TestCase
2121
{
2222
public function testSupportsOnlyAmqpTransports()
2323
{
24-
$factory = new AmqpTransportFactory(
25-
$this->getMockBuilder(SerializerInterface::class)->getMock()
26-
);
24+
$factory = new AmqpTransportFactory();
2725

2826
$this->assertTrue($factory->supports('amqp://localhost', []));
2927
$this->assertFalse($factory->supports('sqs://localhost', []));
@@ -32,12 +30,11 @@ public function testSupportsOnlyAmqpTransports()
3230

3331
public function testItCreatesTheTransport()
3432
{
35-
$factory = new AmqpTransportFactory(
36-
$serializer = $this->getMockBuilder(SerializerInterface::class)->getMock()
37-
);
33+
$factory = new AmqpTransportFactory();
34+
$serializer = $this->createMock(SerializerInterface::class);
3835

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

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

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

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@
1111

1212
namespace Symfony\Component\Messenger\Transport\AmqpExt;
1313

14-
use Symfony\Component\Messenger\Transport\Serialization\PhpSerializer;
1514
use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface;
1615
use Symfony\Component\Messenger\Transport\TransportFactoryInterface;
1716
use Symfony\Component\Messenger\Transport\TransportInterface;
@@ -23,16 +22,9 @@
2322
*/
2423
class AmqpTransportFactory implements TransportFactoryInterface
2524
{
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
25+
public function createTransport(string $dsn, array $options, SerializerInterface $serializer): TransportInterface
3426
{
35-
return new AmqpTransport(Connection::fromDsn($dsn, $options), $this->serializer);
27+
return new AmqpTransport(Connection::fromDsn($dsn, $options), $serializer);
3628
}
3729

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

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

Lines changed: 3 additions & 2 deletions
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

Lines changed: 6 additions & 1 deletion
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)