Skip to content

Commit 8c17e2a

Browse files
bug #61939 [FrameworkBundle] fix using lock from service id when previous locks used env vars (AydinHassan)
This PR was merged into the 7.3 branch. Discussion ---------- [FrameworkBundle] fix using lock from service id when previous locks used env vars | Q | A | ------------- | --- | Branch? | 7.3 | Bug fix? | yes | New feature? | no | Deprecations? | no | Issues | n/a | License | MIT When specifying multiple locks including one which references a service id, and a previous one used an env var, the service id is not converted in to a reference. This is because `usedEnvs` is not reset in the loop and is passed by reference. Not sure if this is intentional or not but it looks like a mistake to me. A similar reset is done [here](https://github.com/symfony/symfony/blob/0cf7a9af6b2b8eeb0ac218f45c0eff56ce2f9f87/src/Symfony/Bundle/FrameworkBundle/DependencyInjection/FrameworkExtension.php#L354-L355). Commits ------- 0cf7a9af6b2 fix using lock from service when previous locks used env vars
2 parents f001632 + 23d7233 commit 8c17e2a

File tree

5 files changed

+63
-0
lines changed

5 files changed

+63
-0
lines changed

DependencyInjection/FrameworkExtension.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2207,6 +2207,7 @@ private function registerLockConfiguration(array $config, ContainerBuilder $cont
22072207
$resourceStore = 'null';
22082208
}
22092209

2210+
$usedEnvs = [];
22102211
$storeDsn = $container->resolveEnvPlaceholders($resourceStore, null, $usedEnvs);
22112212
if (!$usedEnvs && !str_contains($resourceStore, ':') && !\in_array($resourceStore, ['flock', 'semaphore', 'in-memory', 'null'], true)) {
22122213
$resourceStore = new Reference($resourceStore);
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
<?php
2+
3+
$container->setParameter('env(REDIS_DSN)', 'redis://paas.com');
4+
5+
$container->loadFromExtension('framework', [
6+
'annotations' => false,
7+
'http_method_override' => false,
8+
'handle_all_throwables' => true,
9+
'php_errors' => ['log' => true],
10+
'lock' => [
11+
'foo' => '%env(REDIS_DSN)%',
12+
'bar' => 'my_service',
13+
],
14+
]);
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
<?xml version="1.0" ?>
2+
<container xmlns="http://symfony.com/schema/dic/services"
3+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4+
xmlns:framework="http://symfony.com/schema/dic/symfony"
5+
xsi:schemaLocation="http://symfony.com/schema/dic/services https://symfony.com/schema/dic/services/services-1.0.xsd
6+
http://symfony.com/schema/dic/symfony https://symfony.com/schema/dic/symfony/symfony-1.0.xsd">
7+
8+
<parameters>
9+
<parameter key="env(REDIS_URL)">redis://paas.com</parameter>
10+
</parameters>
11+
12+
<framework:config http-method-override="false" handle-all-throwables="true">
13+
<framework:annotations enabled="false" />
14+
<framework:php-errors log="true" />
15+
<framework:lock>
16+
<framework:resource name="foo">%env(REDIS_DSN)%</framework:resource>
17+
<framework:resource name="bar">my_service</framework:resource>
18+
</framework:lock>
19+
</framework:config>
20+
</container>
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
services:
2+
my_service:
3+
class: \Redis
4+
5+
framework:
6+
annotations: false
7+
http_method_override: false
8+
handle_all_throwables: true
9+
php_errors:
10+
log: true
11+
lock:
12+
foo: "%env(REDIS_DSN)%"
13+
bar: my_service

Tests/DependencyInjection/FrameworkExtensionTestCase.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2629,6 +2629,21 @@ public function testLockWithService()
26292629
self::assertEquals(new Reference('my_service'), $storeDef->getArgument(0));
26302630
}
26312631

2632+
public function testLockWithServiceAndEnv()
2633+
{
2634+
$container = $this->createContainerFromFile('lock_service_and_env', [], true, false);
2635+
$container->getCompilerPassConfig()->setOptimizationPasses([new ResolveChildDefinitionsPass()]);
2636+
$container->compile();
2637+
2638+
self::assertTrue($container->hasDefinition('lock.foo.factory'));
2639+
self::assertTrue($container->hasDefinition('lock.bar.factory'));
2640+
$storeDef = $container->getDefinition($container->getDefinition('lock.bar.factory')->getArgument(0));
2641+
2642+
$connection = $storeDef->getArgument(0);
2643+
self::assertInstanceOf(Reference::class, $connection);
2644+
self::assertEquals('my_service', $connection->__toString());
2645+
}
2646+
26322647
public function testDefaultSemaphore()
26332648
{
26342649
$container = $this->createContainerFromFile('semaphore');

0 commit comments

Comments
 (0)