Skip to content

Commit 4243868

Browse files
committed
Fix #58
1 parent 1b989e5 commit 4243868

File tree

2 files changed

+33
-4
lines changed

2 files changed

+33
-4
lines changed

src/Config.php

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,14 +99,19 @@ private static function envVarToArray(array &$array, string $var, string $value)
9999
$var = substr($var, 4);
100100
$keys = array_map(strtolower(...), explode('_', $var));
101101

102+
$current = &$array;
103+
102104
foreach ($keys as $i => $key) {
103105
if (count($keys) === 1) {
104106
break;
105107
}
106108

107-
unset($keys[$i]);
108-
109-
$array = &$array[$key];
109+
if (isset($current[$key]) && is_array($current[$key])) {
110+
$current = &$current[$key];
111+
unset($keys[$i]);
112+
} else {
113+
break;
114+
}
110115
}
111116

112117
if (json_validate($value)) {
@@ -117,7 +122,7 @@ private static function envVarToArray(array &$array, string $var, string $value)
117122
}
118123
}
119124

120-
$array[array_shift($keys)] = $value;
125+
$current[implode('_', $keys)] = $value;
121126
}
122127

123128
/**

tests/ConfigTest.php

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,4 +59,28 @@ public function testEnvOverride(): void {
5959

6060
$this->assertSame('d. m. Y', Config::get('timeformat', ''));
6161
}
62+
63+
public function testEnvNested(): void {
64+
putenv('PCA_REDIS_0_HOST=127.0.0.1');
65+
putenv('PCA_REDIS_0_PORT=6379');
66+
67+
$redis_config = Config::get('redis', []);
68+
69+
$this->assertSame('127.0.0.1', $redis_config[0]['host'] ?? null);
70+
$this->assertSame(6379, $redis_config[0]['port'] ?? null);
71+
}
72+
73+
public function testEnvCollisionWithScalar(): void {
74+
putenv('PCA_TIMEFORMAT=d. m. Y H:i:s');
75+
putenv('PCA_TIMEFORMAT_EXTRA=test');
76+
77+
$this->assertSame('d. m. Y H:i:s', Config::get('timeformat', ''));
78+
$this->assertSame('test', Config::get('timeformat_extra'));
79+
}
80+
81+
public function testEnvSnakeCase(): void {
82+
putenv('PCA_SOME_SNAKE_CASE_KEY=value');
83+
84+
$this->assertSame('value', Config::get('some_snake_case_key'));
85+
}
6286
}

0 commit comments

Comments
 (0)