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 85d2f05

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

File tree

2 files changed

+60
-15
lines changed
Filter options

2 files changed

+60
-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
+33Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
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;
1012

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

0 commit comments

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