Skip to content

Commit 6500f7e

Browse files
committed
Load environment variables from $_ENV before checking $_SERVER
1 parent 7375a50 commit 6500f7e

2 files changed

Lines changed: 60 additions & 1 deletion

File tree

src/Container.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -296,7 +296,7 @@ private function loadParameter(\ReflectionParameter $parameter, int $depth, bool
296296

297297
private function hasVariable(string $name): bool
298298
{
299-
return (\is_array($this->container) && \array_key_exists($name, $this->container)) || (\is_string($_SERVER[$name] ?? null) && \preg_match('/^[A-Z][A-Z0-9_]+$/', $name));
299+
return (\is_array($this->container) && \array_key_exists($name, $this->container)) || (isset($_ENV[$name]) || (\is_string($_SERVER[$name] ?? null)) && \preg_match('/^[A-Z][A-Z0-9_]+$/', $name));
300300
}
301301

302302
/**
@@ -329,6 +329,9 @@ private function loadVariable(string $name, string $type, bool $nullable, int $d
329329
$this->container[$name] = $value;
330330
} elseif (\is_array($this->container) && \array_key_exists($name, $this->container)) {
331331
$value = $this->container[$name];
332+
} elseif (isset($_ENV[$name])) {
333+
assert(\is_string($_ENV[$name]));
334+
$value = $_ENV[$name];
332335
} else {
333336
assert(\is_string($_SERVER[$name] ?? null));
334337
$value = $_SERVER[$name];

tests/ContainerTest.php

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2039,6 +2039,17 @@ public function testGetEnvReturnsStringFromMapFactory(): void
20392039
$this->assertEquals('bar', $container->getEnv('X_FOO'));
20402040
}
20412041

2042+
public function testGetEnvReturnsStringFromGlobalEnvIfNotSetInMap(): void
2043+
{
2044+
$container = new Container([]);
2045+
2046+
$_ENV['X_FOO'] = 'bar';
2047+
$ret = $container->getEnv('X_FOO');
2048+
unset($_ENV['X_FOO']);
2049+
2050+
$this->assertEquals('bar', $ret);
2051+
}
2052+
20422053
public function testGetEnvReturnsStringFromGlobalServerIfNotSetInMap(): void
20432054
{
20442055
$container = new Container([]);
@@ -2050,6 +2061,18 @@ public function testGetEnvReturnsStringFromGlobalServerIfNotSetInMap(): void
20502061
$this->assertEquals('bar', $ret);
20512062
}
20522063

2064+
public function testGetEnvReturnsStringFromGlobalEnvBeforeServerIfNotSetInMap(): void
2065+
{
2066+
$container = new Container([]);
2067+
2068+
$_ENV['X_FOO'] = 'foo';
2069+
$_SERVER['X_FOO'] = 'bar';
2070+
$ret = $container->getEnv('X_FOO');
2071+
unset($_ENV['X_FOO'], $_SERVER['X_FOO']);
2072+
2073+
$this->assertEquals('foo', $ret);
2074+
}
2075+
20532076
public function testGetEnvReturnsStringFromPsrContainer(): void
20542077
{
20552078
$psr = $this->createMock(ContainerInterface::class);
@@ -2074,6 +2097,22 @@ public function testGetEnvReturnsNullIfPsrContainerHasNoEntry(): void
20742097
$this->assertNull($container->getEnv('X_FOO'));
20752098
}
20762099

2100+
public function testGetEnvReturnsStringFromGlobalEnvIfPsrContainerHasNoEntry(): void
2101+
{
2102+
$psr = $this->createMock(ContainerInterface::class);
2103+
$psr->expects($this->atLeastOnce())->method('has')->with('X_FOO')->willReturn(false);
2104+
$psr->expects($this->never())->method('get');
2105+
2106+
assert($psr instanceof ContainerInterface);
2107+
$container = new Container($psr);
2108+
2109+
$_ENV['X_FOO'] = 'bar';
2110+
$ret = $container->getEnv('X_FOO');
2111+
unset($_ENV['X_FOO']);
2112+
2113+
$this->assertEquals('bar', $ret);
2114+
}
2115+
20772116
public function testGetEnvReturnsStringFromGlobalServerIfPsrContainerHasNoEntry(): void
20782117
{
20792118
$psr = $this->createMock(ContainerInterface::class);
@@ -2090,6 +2129,23 @@ public function testGetEnvReturnsStringFromGlobalServerIfPsrContainerHasNoEntry(
20902129
$this->assertEquals('bar', $ret);
20912130
}
20922131

2132+
public function testGetEnvReturnsStringFromGlobalEnvBeforeServerIfPsrContainerHasNoEntry(): void
2133+
{
2134+
$psr = $this->createMock(ContainerInterface::class);
2135+
$psr->expects($this->atLeastOnce())->method('has')->with('X_FOO')->willReturn(false);
2136+
$psr->expects($this->never())->method('get');
2137+
2138+
assert($psr instanceof ContainerInterface);
2139+
$container = new Container($psr);
2140+
2141+
$_ENV['X_FOO'] = 'foo';
2142+
$_SERVER['X_FOO'] = 'bar';
2143+
$ret = $container->getEnv('X_FOO');
2144+
unset($_ENV['X_FOO'], $_SERVER['X_FOO']);
2145+
2146+
$this->assertEquals('foo', $ret);
2147+
}
2148+
20932149
public function testGetEnvThrowsIfMapContainsInvalidType(): void
20942150
{
20952151
$container = new Container([

0 commit comments

Comments
 (0)