From b09d12aad5eca2e747eb42d889b736c09b5903d8 Mon Sep 17 00:00:00 2001 From: sunxyw Date: Mon, 22 Aug 2022 17:02:50 +0800 Subject: [PATCH] add config patch support --- src/ZM/Config/RefactoredConfig.php | 25 ++++++++++++------------ tests/ZM/Config/RefactoredConfigTest.php | 22 ++++++++++++++------- 2 files changed, 27 insertions(+), 20 deletions(-) diff --git a/src/ZM/Config/RefactoredConfig.php b/src/ZM/Config/RefactoredConfig.php index 9b94ccc3..24e2f3f1 100644 --- a/src/ZM/Config/RefactoredConfig.php +++ b/src/ZM/Config/RefactoredConfig.php @@ -102,7 +102,7 @@ class RefactoredConfig // 按照加载顺序加载配置文件 foreach (self::LOAD_ORDER as $load_type) { foreach ($stages[$load_type] as $file_path) { - logger()->info('Loading config file: ' . $file_path); + logger()->info("加载配置文件:{$file_path}"); $this->loadConfigFromPath($file_path); } } @@ -196,7 +196,6 @@ class RefactoredConfig */ private function getFileLoadType(string $name): string { - // TODO: 对于多段名称的处理,如 test.patch.development // 传入此处的 name 参数有三种可能的格式: // 1. 纯文件名:如 test,此时加载类型为 global // 2. 文件名.环境:如 test.development,此时加载类型为 environment @@ -223,20 +222,20 @@ class RefactoredConfig private function shouldLoadFile(string $path): bool { $name = pathinfo($path, PATHINFO_FILENAME); - // 传入此处的 name 参数有两种可能的格式: - // 1. 纯文件名:如 test - // 2. 文件名.环境:如 test.development - // 对于第一种格式,在任何情况下均应该加载 - // 对于第二种格式,只有当环境与当前环境相同时才加载 - // 至于其他的格式,则为未定义行为 - if (strpos($name, '.') === false) { + // 对于 `global` 和 `patch`,任何情况下均应加载 + // 对于 `environment`,只有当环境与当前环境相同时才加载 + // 对于其他情况,则不加载 + $type = $this->getFileLoadType($name); + if ($type === 'global' || $type === 'patch') { return true; } - $name_and_env = explode('.', $name); - if (count($name_and_env) !== 2) { - return false; + if ($type === 'environment') { + $name_and_env = explode('.', $name); + if ($name_and_env[1] === $this->environment) { + return true; + } } - return $name_and_env[1] === $this->environment; + return false; } /** diff --git a/tests/ZM/Config/RefactoredConfigTest.php b/tests/ZM/Config/RefactoredConfigTest.php index 37c00ed4..1fcaab06 100644 --- a/tests/ZM/Config/RefactoredConfigTest.php +++ b/tests/ZM/Config/RefactoredConfigTest.php @@ -43,20 +43,23 @@ class RefactoredConfigTest extends TestCase 'a' => [ 'b.c' => 'd', ], - 'from' => 'global', + 'global' => 'yes', ]; // 下方测试需要临时写入的文件 file_put_contents($mock_dir . '/test.php', ' "environment", "env" => "development"];' + ' "yes", "env" => "development"];' ); file_put_contents( $mock_dir . '/test.production.php', - ' "environment", "env" => "production"];' + ' "yes", "env" => "production"];' + ); + file_put_contents( + $mock_dir . '/test.patch.php', + ' "yes"];' ); - file_put_contents($mock_dir . '/test.invalid.php', ' "invalid"];'); $config = new RefactoredConfig([ __DIR__ . '/config_mock', @@ -126,10 +129,15 @@ class RefactoredConfigTest extends TestCase public function testGetEnvironmentSpecifiedValue(): void { - $this->assertSame('environment', self::$config->get('test.from')); + $this->assertSame('yes', self::$config->get('test.environment')); $this->assertSame('development', self::$config->get('test.env')); } + public function testGetPatchSpecifiedValue(): void + { + $this->assertSame('yes', self::$config->get('test.patch')); + } + /** * @dataProvider providerTestGetFileLoadType */ @@ -145,9 +153,9 @@ class RefactoredConfigTest extends TestCase return [ 'global' => ['test', 'global'], 'environment' => ['test.development', 'environment'], - 'undefined' => ['test.dev.inv', 'undefined'], 'patch' => ['test.patch', 'patch'], - // 'complex' => ['test.patch.development', 'patch'], + // complex case are not supported yet + 'invalid' => ['test.patch.development', 'undefined'], ]; } }