From a9cd7d768b9658fb8e9fa505ade58e5211ed7049 Mon Sep 17 00:00:00 2001 From: Ousama Ben Younes Date: Sun, 10 May 2026 22:50:18 +0000 Subject: [PATCH] [FrameworkBundle] Bump Request/Session value resolver priority above EntityValueResolver --- Resources/config/web.php | 7 +++++-- .../FrameworkExtensionTestCase.php | 16 ++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/Resources/config/web.php b/Resources/config/web.php index 6710dabda..0bcc354d1 100644 --- a/Resources/config/web.php +++ b/Resources/config/web.php @@ -80,10 +80,13 @@ ->tag('controller.argument_value_resolver', ['priority' => 100, 'name' => RequestAttributeValueResolver::class]) ->set('argument_resolver.request', RequestValueResolver::class) - ->tag('controller.argument_value_resolver', ['priority' => 50, 'name' => RequestValueResolver::class]) + // Run before EntityValueResolver (DoctrineBundle, priority 110) so type-hinted + // Request arguments do not trigger entity-manager bootstrap. Keep this above + // DoctrineBundle's EntityValueResolver priority if it ever changes. + ->tag('controller.argument_value_resolver', ['priority' => 120, 'name' => RequestValueResolver::class]) ->set('argument_resolver.session', SessionValueResolver::class) - ->tag('controller.argument_value_resolver', ['priority' => 50, 'name' => SessionValueResolver::class]) + ->tag('controller.argument_value_resolver', ['priority' => 120, 'name' => SessionValueResolver::class]) ->set('argument_resolver.service', ServiceValueResolver::class) ->args([ diff --git a/Tests/DependencyInjection/FrameworkExtensionTestCase.php b/Tests/DependencyInjection/FrameworkExtensionTestCase.php index a22e2e8df..d9f8b9d5e 100644 --- a/Tests/DependencyInjection/FrameworkExtensionTestCase.php +++ b/Tests/DependencyInjection/FrameworkExtensionTestCase.php @@ -172,6 +172,22 @@ public function testPropertyAccessCacheWithDebug() $this->assertSame(ArrayAdapter::class, $cache->getClass(), 'ArrayAdapter should be used in debug mode'); } + public function testRequestAndSessionValueResolversRunBeforeEntityValueResolver() + { + $container = $this->createContainerFromFile('full'); + + // DoctrineBundle ships EntityValueResolver at priority 110. Lower priorities trigger an + // entity-manager bootstrap on every Request/Session controller argument before the + // dedicated resolver is asked, costing tens of ms per request. + $entityValueResolverPriority = 110; + + $requestTag = $container->getDefinition('argument_resolver.request')->getTag('controller.argument_value_resolver'); + $this->assertGreaterThan($entityValueResolverPriority, $requestTag[0]['priority']); + + $sessionTag = $container->getDefinition('argument_resolver.session')->getTag('controller.argument_value_resolver'); + $this->assertGreaterThan($entityValueResolverPriority, $sessionTag[0]['priority']); + } + public function testCsrfProtectionNeedsSessionToBeEnabled() { $this->expectException(\LogicException::class);