Skip to content

Commit 1fc3ef3

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

File tree

5 files changed

+34
-19
lines changed

5 files changed

+34
-19
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 & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1587,22 +1587,10 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
15871587
$container->removeDefinition('messenger.transport.symfony_serializer');
15881588
$container->removeDefinition('messenger.transport.amqp.factory');
15891589
} 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-
}
1590+
$container->getDefinition('messenger.transport.symfony_serializer')
1591+
->replaceArgument(1, $config['serializer']['format'])
1592+
->replaceArgument(2, $config['serializer']['context']);
1593+
$container->setAlias('messenger.transport.serializer', $config['serializer']['id']);
16061594
}
16071595

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

16491637
$senderAliases = [];
16501638
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".');
1639+
if (null !== $transport['serializer']) {
1640+
$transport['options']['serializer'] = new Reference($transport['serializer']);
16531641
}
16541642

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

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

Lines changed: 16 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,19 @@ 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+
57+
$this->assertEquals($expectedTransport, $factory->createTransport('amqp://localhost', ['foo' => 'bar', 'serializer' => $serializer]));
58+
}
4359
}

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)