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

Skip to content

Commit e0b8cb7

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

File tree

5 files changed

+33
-20
lines changed
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([])
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))
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
}
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
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;