Skip to content

Commit

Permalink
reset env vars on kernel.reset
Browse files Browse the repository at this point in the history
- fixes #54627
- fixes fabbot
  • Loading branch information
faizanakram99 committed Apr 22, 2024
1 parent 02c1e3c commit b515bfb
Show file tree
Hide file tree
Showing 4 changed files with 78 additions and 4 deletions.
1 change: 1 addition & 0 deletions src/Symfony/Bundle/FrameworkBundle/CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ CHANGELOG
* Attach the workflow's configuration to the `workflow` tag
* Add the `allowed_recipients` option for mailer to allow some users to receive
emails even if `recipients` is defined.
* Reset env vars on kernel.reset

7.0
---
Expand Down
2 changes: 2 additions & 0 deletions src/Symfony/Component/DependencyInjection/Container.php
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,8 @@ public function reset(): void
continue;
}
}

$this->envCache = [];
}

/**
Expand Down
15 changes: 12 additions & 3 deletions src/Symfony/Component/DependencyInjection/EnvVarProcessor.php
Original file line number Diff line number Diff line change
Expand Up @@ -14,15 +14,18 @@
use Symfony\Component\DependencyInjection\Exception\EnvNotFoundException;
use Symfony\Component\DependencyInjection\Exception\ParameterCircularReferenceException;
use Symfony\Component\DependencyInjection\Exception\RuntimeException;
use Symfony\Contracts\Service\ResetInterface;

/**
* @author Nicolas Grekas <p@tchwork.com>
*/
class EnvVarProcessor implements EnvVarProcessorInterface
class EnvVarProcessor implements EnvVarProcessorInterface, ResetInterface
{
private ContainerInterface $container;
/** @var \Traversable<EnvVarLoaderInterface> */
private \Traversable $loaders;
/** @var \Traversable<EnvVarLoaderInterface> */
private \Traversable $originalLoaders;
private array $loadedVars = [];

/**
Expand All @@ -31,7 +34,7 @@ class EnvVarProcessor implements EnvVarProcessorInterface
public function __construct(ContainerInterface $container, ?\Traversable $loaders = null)
{
$this->container = $container;
$this->loaders = $loaders ?? new \ArrayIterator();
$this->originalLoaders = $this->loaders = $loaders ?? new \ArrayIterator();
}

public static function getProvidedTypes(): array
Expand Down Expand Up @@ -79,7 +82,7 @@ public function getEnv(string $prefix, string $name, \Closure $getEnv): mixed
}

if (!isset($array[$key]) && !\array_key_exists($key, $array)) {
throw new EnvNotFoundException(sprintf('Key "%s" not found in %s (resolved from "%s").', $key, json_encode($array), $next));
throw new EnvNotFoundException(sprintf('Key "%s" not found in "%s" (resolved from "%s").', $key, json_encode($array), $next));
}

return $array[$key];
Expand Down Expand Up @@ -366,4 +369,10 @@ public function getEnv(string $prefix, string $name, \Closure $getEnv): mixed

throw new RuntimeException(sprintf('Unsupported env var prefix "%s" for env name "%s".', $prefix, $name));
}

public function reset(): void
{
$this->loadedVars = [];
$this->loaders = $this->originalLoaders;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,68 @@ public function testGetEnvBool($value, $processed)
$this->assertSame($processed, $result);
}

public function testGetEnvCachesEnv()
{
$_ENV['FOO'] = '';

$GLOBALS['ENV_FOO'] = 'value';

$loaders = function () {
yield new class() implements EnvVarLoaderInterface {
public function loadEnvVars(): array
{
return ['FOO' => $GLOBALS['ENV_FOO']];
}
};
};

$processor = new EnvVarProcessor(new Container(), new RewindableGenerator($loaders, 1));

$noop = function () {};

$result = $processor->getEnv('string', 'FOO', $noop);
$this->assertSame('value', $result);

$GLOBALS['ENV_FOO'] = 'new value';

$result = $processor->getEnv('string', 'FOO', $noop);
$this->assertSame('value', $result);

unset($_ENV['FOO'], $GLOBALS['ENV_FOO']);
}

public function testReset()
{
$_ENV['FOO'] = '';

$GLOBALS['ENV_FOO'] = 'value';

$loaders = function () {
yield new class() implements EnvVarLoaderInterface {
public function loadEnvVars(): array
{
return ['FOO' => $GLOBALS['ENV_FOO']];
}
};
};

$processor = new EnvVarProcessor(new Container(), new RewindableGenerator($loaders, 1));

$noop = function () {};

$result = $processor->getEnv('string', 'FOO', $noop);
$this->assertSame('value', $result);

$GLOBALS['ENV_FOO'] = 'new value';

$processor->reset();

$result = $processor->getEnv('string', 'FOO', $noop);
$this->assertSame('new value', $result);

unset($_ENV['FOO'], $GLOBALS['ENV_FOO']);
}

/**
* @dataProvider validBools
*/
Expand Down Expand Up @@ -625,7 +687,7 @@ public static function validNullables()
['null', 'null'],
['Null', 'Null'],
['NULL', 'NULL'],
];
];
}

public function testRequireMissingFile()
Expand Down

0 comments on commit b515bfb

Please sign in to comment.