Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit cc1849a

Browse filesBrowse files
committed
Fix EnvVar not loaded when Loader requires an env var
1 parent 642c7ff commit cc1849a
Copy full SHA for cc1849a

File tree

2 files changed

+61
-15
lines changed
Filter options

2 files changed

+61
-15
lines changed

‎src/Symfony/Component/DependencyInjection/EnvVarProcessor.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/EnvVarProcessor.php
+27-15Lines changed: 27 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class EnvVarProcessor implements EnvVarProcessorInterface
2222
{
2323
private $container;
2424
private $loaders;
25+
private $loadedLoaderIndex = 0;
2526
private $loadedVars = [];
2627

2728
/**
@@ -30,8 +31,7 @@ class EnvVarProcessor implements EnvVarProcessorInterface
3031
public function __construct(ContainerInterface $container, \Traversable $loaders = null)
3132
{
3233
$this->container = $container;
33-
$this->loaders = new \IteratorIterator($loaders ?? new \ArrayIterator());
34-
$this->loaders = $this->loaders->getInnerIterator();
34+
$this->loaders = $loaders ?? new \ArrayIterator();
3535
}
3636

3737
/**
@@ -141,20 +141,32 @@ public function getEnv($prefix, $name, \Closure $getEnv)
141141
}
142142
}
143143

144-
$loaders = $this->loaders;
145-
$this->loaders = new \ArrayIterator();
146-
147-
try {
148-
while ((false === $env || null === $env) && $loaders->valid()) {
149-
$loader = $loaders->current();
150-
$loaders->next();
151-
$this->loadedVars[] = $vars = $loader->loadEnvVars();
152-
$env = $vars[$name] ?? false;
144+
if (false === $env || null === $env) {
145+
$loaders = $this->loaders;
146+
$this->loaders = new \ArrayIterator();
147+
148+
try {
149+
$index = 0;
150+
$ended = true;
151+
foreach ($loaders as $loader) {
152+
if ($index++ < $this->loadedLoaderIndex) {
153+
continue;
154+
}
155+
$this->loadedLoaderIndex = $index;
156+
$this->loadedVars[] = $vars = $loader->loadEnvVars();
157+
if (false !== $env = $vars[$name] ?? false) {
158+
$ended = false;
159+
break;
160+
}
161+
}
162+
if ($ended) {
163+
$loaders = new \ArrayIterator();
164+
}
165+
} catch (ParameterCircularReferenceException $e) {
166+
// skip loaders that need an env var that is not defined
167+
} finally {
168+
$this->loaders = $loaders;
153169
}
154-
} catch (ParameterCircularReferenceException $e) {
155-
// skip loaders that need an env var that is not defined
156-
} finally {
157-
$this->loaders = $loaders;
158170
}
159171

160172
if (false === $env || null === $env) {

‎src/Symfony/Component/DependencyInjection/Tests/EnvVarProcessorTest.php

Copy file name to clipboardExpand all lines: src/Symfony/Component/DependencyInjection/Tests/EnvVarProcessorTest.php
+34Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,13 @@
33
namespace Symfony\Component\DependencyInjection\Tests;
44

55
use PHPUnit\Framework\TestCase;
6+
use Symfony\Component\DependencyInjection\Argument\RewindableGenerator;
67
use Symfony\Component\DependencyInjection\Container;
78
use Symfony\Component\DependencyInjection\ContainerBuilder;
89
use Symfony\Component\DependencyInjection\EnvVarLoaderInterface;
910
use Symfony\Component\DependencyInjection\EnvVarProcessor;
11+
use Symfony\Component\DependencyInjection\Exception\ParameterCircularReferenceException;
12+
use Symfony\Component\DependencyInjection\ServiceLocator;
1013

1114
class EnvVarProcessorTest extends TestCase
1215
{
@@ -553,4 +556,35 @@ public function loadEnvVars(): array
553556
$result = $processor->getEnv('string', 'FOO_ENV_LOADER', function () {});
554557
$this->assertSame('123', $result); // check twice
555558
}
559+
560+
public function testCircularEnvLoader()
561+
{
562+
$container = new ContainerBuilder();
563+
$container->setParameter('env(FOO_CONTAINER)', 'foo');
564+
$container->compile();
565+
566+
$index = 0;
567+
$loaders = function () use (&$index) {
568+
if ($index ++ === 0) {
569+
throw new ParameterCircularReferenceException(['FOO_CONTAINER']);
570+
}
571+
572+
yield new class() implements EnvVarLoaderInterface {
573+
public function loadEnvVars(): array
574+
{
575+
return [
576+
'FOO_ENV_LOADER' => '123',
577+
];
578+
}
579+
};
580+
};
581+
582+
$processor = new EnvVarProcessor($container, new RewindableGenerator($loaders, 1));
583+
584+
$result = $processor->getEnv('string', 'FOO_CONTAINER', function () {});
585+
$this->assertSame('foo', $result); // check twice
586+
587+
$result = $processor->getEnv('string', 'FOO_ENV_LOADER', function () {});
588+
$this->assertSame('123', $result); // check twice
589+
}
556590
}

0 commit comments

Comments
0 (0)
Morty Proxy This is a proxified and sanitized view of the page, visit original site.