Skip to content

Commit 49bdd10

Browse files
committed
Merge branch '7.4' into 8.0
* 7.4: [Lock][DynamoDB] Allow symfony/lock 8.0 [ProxyManager] Remove extra space before return‑type colon in `proxy-implem.php` [Config] Use the empty string instead of null as an array offset [Messenger] Support signing messages per handler
2 parents 6709cf2 + bfaa483 commit 49bdd10

File tree

5 files changed

+76
-12
lines changed

5 files changed

+76
-12
lines changed

DependencyInjection/FrameworkExtension.php

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2418,6 +2418,7 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
24182418
$senderAliases = [];
24192419
$transportRetryReferences = [];
24202420
$transportRateLimiterReferences = [];
2421+
$serializerIds = [];
24212422
foreach ($config['transports'] as $name => $transport) {
24222423
$serializerId = $transport['serializer'] ?? 'messenger.default_serializer';
24232424
$tags = [
@@ -2434,6 +2435,7 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
24342435
;
24352436
$container->setDefinition($transportId = 'messenger.transport.'.$name, $transportDefinition);
24362437
$senderAliases[$name] = $transportId;
2438+
$serializerIds[$transportId] = $serializerId;
24372439

24382440
if (null !== $transport['retry_strategy']['service']) {
24392441
$transportRetryReferences[$name] = new Reference($transport['retry_strategy']['service']);
@@ -2461,13 +2463,11 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
24612463
}
24622464

24632465
$senderReferences = [];
2464-
// alias => service_id
2465-
foreach ($senderAliases as $alias => $serviceId) {
2466-
$senderReferences[$alias] = new Reference($serviceId);
2466+
foreach ($senderAliases as $alias => $transportId) {
2467+
$senderReferences[$alias] = new Reference($transportId);
24672468
}
2468-
// service_id => service_id
2469-
foreach ($senderAliases as $serviceId) {
2470-
$senderReferences[$serviceId] = new Reference($serviceId);
2469+
foreach ($senderAliases as $transportId) {
2470+
$senderReferences[$transportId] = new Reference($transportId);
24712471
}
24722472

24732473
foreach ($config['transports'] as $name => $transport) {
@@ -2478,7 +2478,7 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
24782478
}
24792479
}
24802480

2481-
$failureTransportReferencesByTransportName = array_map(fn ($failureTransportName) => $senderReferences[$failureTransportName], $failureTransportsByName);
2481+
$failureTransportReferencesByTransportName = array_map(static fn ($failureTransportName) => $senderReferences[$failureTransportName], $failureTransportsByName);
24822482

24832483
$messageToSendersMapping = [];
24842484
foreach ($config['routing'] as $message => $messageConfiguration) {
@@ -2507,6 +2507,18 @@ private function registerMessengerConfiguration(array $config, ContainerBuilder
25072507
->replaceArgument(1, $sendersServiceLocator)
25082508
;
25092509

2510+
$messageToSerializersMapping = [];
2511+
foreach ($messageToSendersMapping as $message => $senders) {
2512+
foreach ($senders as $sender) {
2513+
$serializerId = $serializerIds[$senderAliases[$sender] ?? $sender];
2514+
$messageToSerializersMapping[$message][$serializerId] = $serializerId;
2515+
}
2516+
$messageToSerializersMapping[$message] = array_keys($messageToSerializersMapping[$message]);
2517+
}
2518+
2519+
$container->getDefinition('messenger.signing_serializer')
2520+
->replaceArgument(2, $messageToSerializersMapping);
2521+
25102522
$container->getDefinition('messenger.retry.send_failed_message_for_retry_listener')
25112523
->replaceArgument(0, $sendersServiceLocator)
25122524
;
@@ -2798,7 +2810,7 @@ private function registerCachingHttpClient(array $options, array $defaultOptions
27982810

27992811
$container
28002812
->register($name.'.caching', CachingHttpClient::class)
2801-
->setDecoratedService($name, null, 15)
2813+
->setDecoratedService($name, null, 15)
28022814
->setArguments([
28032815
new Reference('.inner'),
28042816
new Reference($options['cache_pool']),

Resources/config/console.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -407,6 +407,6 @@
407407
->args([
408408
service('console.messenger.application'),
409409
])
410-
->tag('messenger.message_handler')
410+
->tag('messenger.message_handler', ['sign' => true])
411411
;
412412
};

Resources/config/messenger.php

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

1212
namespace Symfony\Component\DependencyInjection\Loader\Configurator;
1313

14+
use Symfony\Component\DependencyInjection\Parameter;
1415
use Symfony\Component\DependencyInjection\ServiceLocator;
1516
use Symfony\Component\Messenger\Bridge\AmazonSqs\Transport\AmazonSqsTransportFactory;
1617
use Symfony\Component\Messenger\Bridge\Amqp\Transport\AmqpTransportFactory;
@@ -44,13 +45,13 @@
4445
use Symfony\Component\Messenger\Transport\Serialization\PhpSerializer;
4546
use Symfony\Component\Messenger\Transport\Serialization\Serializer;
4647
use Symfony\Component\Messenger\Transport\Serialization\SerializerInterface;
48+
use Symfony\Component\Messenger\Transport\Serialization\SigningSerializer;
4749
use Symfony\Component\Messenger\Transport\Sync\SyncTransportFactory;
4850
use Symfony\Component\Messenger\Transport\TransportFactory;
51+
use Symfony\Component\String\LazyString;
4952

5053
return static function (ContainerConfigurator $container) {
5154
$container->services()
52-
->alias(SerializerInterface::class, 'messenger.default_serializer')
53-
5455
// Asynchronous
5556
->set('messenger.senders_locator', SendersLocator::class)
5657
->args([
@@ -79,6 +80,22 @@
7980

8081
->set('messenger.transport.native_php_serializer', PhpSerializer::class)
8182
->alias('messenger.default_serializer', 'messenger.transport.native_php_serializer')
83+
->alias(SerializerInterface::class, 'messenger.default_serializer')
84+
85+
->set('messenger.signing_serializer', SigningSerializer::class)
86+
->abstract()
87+
->args([
88+
service('.inner'),
89+
inline_service('string') // wrap the signing key in a lazy string to prevent a hard dependency on the kernel.secret parameter
90+
->factory(class_exists(LazyString::class) ? [LazyString::class, 'fromCallable'] : 'current')
91+
->args([
92+
class_exists(LazyString::class, false) ? service_closure('.messenger.signing_serializer.signing_key') : [new Parameter('kernel.secret')],
93+
]),
94+
abstract_arg('message types to serializers'), // read and replaced by MessengerPass
95+
])
96+
->set('.messenger.signing_serializer.signing_key', 'string')
97+
->factory('current')
98+
->args([[new Parameter('kernel.secret')]])
8299

83100
// Middleware
84101
->set('messenger.middleware.handle_message', HandleMessageMiddleware::class)

Resources/config/process.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,6 @@
1717
$container
1818
->services()
1919
->set('process.messenger.process_message_handler', RunProcessMessageHandler::class)
20-
->tag('messenger.message_handler')
20+
->tag('messenger.message_handler', ['sign' => true])
2121
;
2222
};

Tests/DependencyInjection/PhpFrameworkExtensionTest.php

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
use Symfony\Component\DependencyInjection\Exception\LogicException;
1919
use Symfony\Component\DependencyInjection\Exception\OutOfBoundsException;
2020
use Symfony\Component\DependencyInjection\Loader\PhpFileLoader;
21+
use Symfony\Component\Messenger\Tests\Fixtures\DummyMessage;
2122
use Symfony\Component\RateLimiter\CompoundRateLimiterFactory;
2223
use Symfony\Component\RateLimiter\RateLimiterFactoryInterface;
2324
use Symfony\Component\Validator\Constraints\Email;
@@ -368,6 +369,40 @@ public static function emailValidationModeProvider()
368369
yield [$mode];
369370
}
370371
}
372+
373+
public function testMessengerSigningSerializerWiring()
374+
{
375+
$container = $this->createContainerFromClosure(function (ContainerBuilder $container) {
376+
$container->register('signed_handler', 'stdClass')
377+
->addTag('messenger.message_handler', ['handles' => DummyMessage::class, 'sign' => true]);
378+
379+
$container->loadFromExtension('framework', [
380+
'annotations' => false,
381+
'http_method_override' => false,
382+
'handle_all_throwables' => true,
383+
'php_errors' => ['log' => true],
384+
'messenger' => [
385+
'transports' => [
386+
'async' => ['dsn' => 'in-memory://'],
387+
],
388+
'routing' => [
389+
DummyMessage::class => ['senders' => ['async']],
390+
],
391+
'buses' => [
392+
'message_bus' => ['default_middleware' => ['enabled' => true]],
393+
],
394+
],
395+
]);
396+
});
397+
398+
$this->assertTrue($container->hasDefinition('messenger.signing_serializer'));
399+
$mapping = $container->getDefinition('messenger.signing_serializer')->getArgument(2);
400+
$this->assertArrayHasKey(DummyMessage::class, $mapping);
401+
$this->assertNotEmpty($mapping[DummyMessage::class]);
402+
403+
$this->assertTrue($container->hasDefinition('message_bus'));
404+
$this->assertSame('message_bus', (string) $container->getAlias('messenger.default_bus'));
405+
}
371406
}
372407

373408
class WorkflowValidatorWithConstructor implements DefinitionValidatorInterface

0 commit comments

Comments
 (0)