From 0cf7a9af6b2b8eeb0ac218f45c0eff56ce2f9f87 Mon Sep 17 00:00:00 2001 From: Aydin Hassan Date: Fri, 3 Oct 2025 09:02:33 +0200 Subject: [PATCH] fix using lock from service when previous locks used env vars --- .../FrameworkExtension.php | 1 + .../Fixtures/php/lock_service_and_env.php | 14 +++++++++++++ .../Fixtures/xml/lock_service_and_env.xml | 20 +++++++++++++++++++ .../Fixtures/yml/lock_service_and_env.yml | 13 ++++++++++++ .../FrameworkExtensionTestCase.php | 15 ++++++++++++++ 5 files changed, 63 insertions(+) create mode 100644 src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/lock_service_and_env.php create mode 100644 src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/lock_service_and_env.xml create mode 100644 src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/lock_service_and_env.yml diff --git a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php index 66af2771b5837..56de4975a3300 100644 --- a/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php +++ b/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php @@ -2207,6 +2207,7 @@ private function registerLockConfiguration(array $config, ContainerBuilder $cont $resourceStore = 'null'; } + $usedEnvs = []; $storeDsn = $container->resolveEnvPlaceholders($resourceStore, null, $usedEnvs); if (!$usedEnvs && !str_contains($resourceStore, ':') && !\in_array($resourceStore, ['flock', 'semaphore', 'in-memory', 'null'], true)) { $resourceStore = new Reference($resourceStore); diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/lock_service_and_env.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/lock_service_and_env.php new file mode 100644 index 0000000000000..bf65e549c8c3e --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/php/lock_service_and_env.php @@ -0,0 +1,14 @@ +setParameter('env(REDIS_DSN)', 'redis://paas.com'); + +$container->loadFromExtension('framework', [ + 'annotations' => false, + 'http_method_override' => false, + 'handle_all_throwables' => true, + 'php_errors' => ['log' => true], + 'lock' => [ + 'foo' => '%env(REDIS_DSN)%', + 'bar' => 'my_service', + ], +]); diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/lock_service_and_env.xml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/lock_service_and_env.xml new file mode 100644 index 0000000000000..124333d870c49 --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/xml/lock_service_and_env.xml @@ -0,0 +1,20 @@ + + + + + redis://paas.com + + + + + + + %env(REDIS_DSN)% + my_service + + + diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/lock_service_and_env.yml b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/lock_service_and_env.yml new file mode 100644 index 0000000000000..f2fc85f76173c --- /dev/null +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/Fixtures/yml/lock_service_and_env.yml @@ -0,0 +1,13 @@ +services: + my_service: + class: \Redis + +framework: + annotations: false + http_method_override: false + handle_all_throwables: true + php_errors: + log: true + lock: + foo: "%env(REDIS_DSN)%" + bar: my_service diff --git a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTestCase.php b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTestCase.php index 1a0251d56d002..5cd73fcf4cd35 100644 --- a/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTestCase.php +++ b/src/Symfony/Bundle/FrameworkBundle/Tests/DependencyInjection/FrameworkExtensionTestCase.php @@ -2629,6 +2629,21 @@ public function testLockWithService() self::assertEquals(new Reference('my_service'), $storeDef->getArgument(0)); } + public function testLockWithServiceAndEnv() + { + $container = $this->createContainerFromFile('lock_service_and_env', [], true, false); + $container->getCompilerPassConfig()->setOptimizationPasses([new ResolveChildDefinitionsPass()]); + $container->compile(); + + self::assertTrue($container->hasDefinition('lock.foo.factory')); + self::assertTrue($container->hasDefinition('lock.bar.factory')); + $storeDef = $container->getDefinition($container->getDefinition('lock.bar.factory')->getArgument(0)); + + $connection = $storeDef->getArgument(0); + self::assertInstanceOf(Reference::class, $connection); + self::assertEquals('my_service', $connection->__toString()); + } + public function testDefaultSemaphore() { $container = $this->createContainerFromFile('semaphore');