mirror of
https://github.com/zhamao-robot/zhamao-framework.git
synced 2026-03-17 20:54:52 +08:00
add basic usable config
This commit is contained in:
parent
aa8fdf557e
commit
f819922d8a
@ -72,20 +72,31 @@ class RefactoredConfig
|
||||
foreach ($this->config_paths as $config_path) {
|
||||
$files = scandir($config_path);
|
||||
foreach ($files as $file) {
|
||||
// 略过不支持的文件
|
||||
if (!in_array(pathinfo($file, PATHINFO_EXTENSION), self::ALLOWED_FILE_EXTENSIONS, true)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$file_path = $config_path . '/' . $file;
|
||||
if (is_dir($file_path)) {
|
||||
// TODO: 支持子目录(待定)
|
||||
continue;
|
||||
}
|
||||
|
||||
$file = pathinfo($file, PATHINFO_FILENAME);
|
||||
|
||||
// 略过不应加载的文件
|
||||
if (!$this->shouldLoadFile($file)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 略过加载顺序未知的文件
|
||||
$load_type = $this->getFileLoadType($file);
|
||||
if (!in_array($load_type, self::LOAD_ORDER, true)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
// 将文件加入到对应的加载阶段
|
||||
$stages[$load_type][] = $file_path;
|
||||
}
|
||||
}
|
||||
@ -93,10 +104,7 @@ class RefactoredConfig
|
||||
// 按照加载顺序加载配置文件
|
||||
foreach (self::LOAD_ORDER as $load_type) {
|
||||
foreach ($stages[$load_type] as $file_path) {
|
||||
$file = pathinfo($file_path, PATHINFO_FILENAME);
|
||||
if ($this->shouldLoadFile($file)) {
|
||||
$this->loadConfigFromPath($file);
|
||||
}
|
||||
$this->loadConfigFromPath($file_path);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
101
tests/ZM/Config/RefactoredConfigTest.php
Normal file
101
tests/ZM/Config/RefactoredConfigTest.php
Normal file
@ -0,0 +1,101 @@
|
||||
<?php
|
||||
|
||||
namespace Tests\ZM\Config;
|
||||
|
||||
use ZM\Config\RefactoredConfig;
|
||||
use PHPUnit\Framework\TestCase;
|
||||
|
||||
class RefactoredConfigTest extends TestCase
|
||||
{
|
||||
private static $config;
|
||||
|
||||
public static function setUpBeforeClass(): void
|
||||
{
|
||||
$mock_dir = __DIR__ . '/config_mock';
|
||||
if (!is_dir($mock_dir)) {
|
||||
mkdir($mock_dir, 0755, true);
|
||||
}
|
||||
|
||||
$test_config = [
|
||||
'foo' => 'bar',
|
||||
'bar' => 'baz',
|
||||
'baz' => 'bat',
|
||||
'null' => null,
|
||||
'boolean' => true,
|
||||
'associate' => [
|
||||
'x' => 'xxx',
|
||||
'y' => 'yyy',
|
||||
],
|
||||
'array' => [
|
||||
'aaa',
|
||||
'zzz',
|
||||
],
|
||||
'x' => [
|
||||
'z' => 'zoo',
|
||||
],
|
||||
'a.b' => 'c',
|
||||
'a' => [
|
||||
'b.c' => 'd',
|
||||
],
|
||||
'from' => 'global',
|
||||
];
|
||||
|
||||
// 下方测试需要临时写入的文件
|
||||
file_put_contents($mock_dir . '/test.php', '<?php return ' . var_export($test_config, true) . ';');
|
||||
file_put_contents($mock_dir . '/test.development.php',
|
||||
'<?php return ["from" => "environment", "env" => "dev"];');
|
||||
file_put_contents($mock_dir . '/test.production.php',
|
||||
'<?php return ["from" => "environment", "env" => "prod"];');
|
||||
file_put_contents($mock_dir . '/test.invalid.php', '<?php return ["from" => "invalid"];');
|
||||
|
||||
$config = new RefactoredConfig([
|
||||
__DIR__ . '/config_mock',
|
||||
], 'development');
|
||||
self::$config = $config;
|
||||
}
|
||||
|
||||
public static function tearDownAfterClass(): void
|
||||
{
|
||||
foreach (scandir(__DIR__ . '/config_mock') as $file) {
|
||||
if ($file !== '.' && $file !== '..') {
|
||||
unlink(__DIR__ . '/config_mock/' . $file);
|
||||
}
|
||||
}
|
||||
rmdir(__DIR__ . '/config_mock');
|
||||
}
|
||||
|
||||
public function testGetValueWhenKeyContainsDot(): void
|
||||
{
|
||||
$this->markTestSkipped('should it be supported?');
|
||||
$this->assertEquals('c', self::$config->get('test.a.b'));
|
||||
$this->assertEquals('d', self::$config->get('test.a.b.c'));
|
||||
}
|
||||
|
||||
public function testGetBooleanValue(): void
|
||||
{
|
||||
$this->assertTrue(self::$config->get('test.boolean'));
|
||||
}
|
||||
|
||||
public function testGetValue(): void
|
||||
{
|
||||
$this->assertSame('bar', self::$config->get('test.foo'));
|
||||
}
|
||||
|
||||
public function testGetWithDefault(): void
|
||||
{
|
||||
$this->assertSame('default', self::$config->get('not_exist', 'default'));
|
||||
}
|
||||
|
||||
public function testSetValue(): void
|
||||
{
|
||||
self::$config->set('key', 'value');
|
||||
$this->assertSame('value', self::$config->get('key'));
|
||||
}
|
||||
|
||||
public function testSetArrayValue(): void
|
||||
{
|
||||
self::$config->set('array', ['a', 'b']);
|
||||
$this->assertSame(['a', 'b'], self::$config->get('array'));
|
||||
$this->assertSame('a', self::$config->get('array.0'));
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user