From 6cbde80a1c7596ef741752e69349fb34353a349d Mon Sep 17 00:00:00 2001 From: sunxyw Date: Tue, 23 Aug 2022 17:36:45 +0800 Subject: [PATCH] delete outdated config classes --- src/ZM/Config/ConfigMetadata.php | 18 -- src/ZM/Config/ZMConfig.php | 296 ------------------------------- 2 files changed, 314 deletions(-) delete mode 100644 src/ZM/Config/ConfigMetadata.php delete mode 100644 src/ZM/Config/ZMConfig.php diff --git a/src/ZM/Config/ConfigMetadata.php b/src/ZM/Config/ConfigMetadata.php deleted file mode 100644 index 040263ca..00000000 --- a/src/ZM/Config/ConfigMetadata.php +++ /dev/null @@ -1,18 +0,0 @@ -debug('配置文件' . $name . ' ' . $additional_key . '没读取过,正在从文件加载 ...'); - self::$config[$head_name] = self::loadConfig($head_name); - } - // global.remote_terminal - logger()->debug('根据切分来寻找子配置: ' . $name); - $obj = self::$config[$head_name]; - foreach ($separated as $key) { - if (isset($obj[$key])) { - $obj = $obj[$key]; - } else { - return null; - } - } - return $obj; - } - - public static function trace(string $name) - { - // TODO: 调试配置文件搜寻路径 - } - - public static function reload() - { - self::$config = []; - self::$config_meta_list = []; - } - - /** - * 智能patch,将patch数组内的数据合并更新到data中 - * - * @param array|mixed $data 原数据 - * @param array|mixed $patch 要patch的数据 - * @return array|mixed - */ - public static function smartPatch($data, $patch) - { - /* patch 样例: - [patch] - runtime: - annotation_reader_ignore: ["牛逼"] - custom: "非常酷的patch模式" - - [base] - runtime: - annotation_reader_ignore: [] - reload_delay_time: 800 - - [result] - runtime: - annotation_reader_ignore: ["牛逼"] - reload_delay_time: 800 - custom: "非常酷的patch模式" - */ - if (is_array($data) && is_array($patch)) { // 两者必须是数组才行 - if (is_assoc_array($patch) && is_assoc_array($data)) { // 两者必须都是kv数组才能递归merge,如果是顺序数组,则直接覆盖 - foreach ($patch as $k => $v) { - if (!isset($data[$k])) { // 如果项目不在基类存在,则直接写入 - $data[$k] = $v; - } else { // 如果base存在的话,则递归patch覆盖 - $data[$k] = self::smartPatch($data[$k], $v); - } - } - return $data; - } - } - return $patch; - } - - /** - * 加载配置文件 - * - * @throws ConfigException - * @return array|int|string - */ - private static function loadConfig(string $name) - { - // 首先获取此名称的所有配置文件的路径 - self::parseList($name); - - $env1_patch0 = null; - $env1_patch1 = null; - $env0_patch0 = null; - $env0_patch1 = null; - foreach (self::$config_meta_list[$name] as $v) { - /** @var ConfigMetadata $v */ - if ($v->is_env && !$v->is_patch) { - $env1_patch0 = $v->data; - } elseif ($v->is_env && $v->is_patch) { - $env1_patch1 = $v->data; - } elseif (!$v->is_env && !$v->is_patch) { - $env0_patch0 = $v->data; - } else { - $env0_patch1 = $v->data; - } - } - // 优先级:无env无patch < 无env有patch < 有env无patch < 有env有patch - // 但是无patch的版本必须有一个,否则会报错 - if ($env1_patch0 === null && $env0_patch0 === null) { - throw new ConfigException('E00078', '未找到配置文件 ' . $name . ' !'); - } - $data = $env1_patch0 ?? $env0_patch0; - if (is_array($patch = $env1_patch1 ?? $env0_patch1) && is_assoc_array($patch)) { - $data = self::smartPatch($data, $patch); - } - - return $data; - } - - /** - * 通过名称将所有该名称的配置文件路径和信息读取到列表中 - * - * @throws ConfigException - */ - private static function parseList(string $name): void - { - $list = []; - $files = FileSystem::scanDirFiles(self::$path, true, true); - foreach ($files as $file) { - logger()->debug('正在从目录' . self::$path . '读取配置文件 ' . $file); - $info = pathinfo($file); - $info['extension'] = $info['extension'] ?? ''; - - // 排除子文件夹名字带点的文件 - if ($info['dirname'] !== '.' && strpos($info['dirname'], '.') !== false) { - continue; - } - - // 判断文件名是否为配置文件 - if (!in_array($info['extension'], self::SUPPORTED_EXTENSIONS)) { - continue; - } - - $ext = $info['extension']; - $dot_separated = explode('.', $info['filename']); - - // 将配置文件加进来 - $obj = new ConfigMetadata(); - if ($dot_separated[0] === $name) { // 如果文件名与配置文件名一致 - // 首先检测该文件是否为补丁版本儿 - if (str_ends_with($info['filename'], '.patch')) { - $obj->is_patch = true; - $info['filename'] = substr($info['filename'], 0, -6); - } else { - $obj->is_patch = false; - } - // 其次检测该文件是不是带有环境参数的版本儿 - if (str_ends_with($info['filename'], '.' . self::$env)) { - $obj->is_env = true; - $info['filename'] = substr($info['filename'], 0, -(strlen(self::$env) + 1)); - } else { - $obj->is_env = false; - } - if (mb_strpos($info['filename'], '.') !== false) { - logger()->warning('文件名 ' . $info['filename'] . ' 不合法(含有"."),请检查文件名是否合法。'); - continue; - } - $obj->path = zm_dir(self::$path . '/' . $info['dirname'] . '/' . $info['basename']); - $obj->extension = $ext; - $obj->data = self::readConfigFromFile(zm_dir(self::$path . '/' . $info['dirname'] . '/' . $info['basename']), $info['extension']); - $list[] = $obj; - } - } - // 如果是源码模式,config目录和default目录相同,所以不需要继续采摘default目录下的文件 - if (realpath(self::$path) !== realpath(self::DEFAULT_PATH)) { - $files = FileSystem::scanDirFiles(self::DEFAULT_PATH, true, true); - foreach ($files as $file) { - $info = pathinfo($file); - $info['extension'] = $info['extension'] ?? ''; - // 判断文件名是否为配置文件 - if (!in_array($info['extension'], self::SUPPORTED_EXTENSIONS)) { - continue; - } - if ($info['filename'] === $name) { // 如果文件名与配置文件名一致,就创建一个配置文件的元数据对象 - $obj = new ConfigMetadata(); - $obj->is_patch = false; - $obj->is_env = false; - $obj->path = realpath(self::DEFAULT_PATH . '/' . $info['dirname'] . '/' . $info['basename']); - $obj->extension = $info['extension']; - $obj->data = self::readConfigFromFile(zm_dir(self::DEFAULT_PATH . '/' . $info['dirname'] . '/' . $info['basename']), $info['extension']); - $list[] = $obj; - } - } - } - self::$config_meta_list[$name] = $list; - } - - /** - * 根据不同的扩展类型读取配置文件数组 - * - * @param mixed|string $filename 文件名 - * @param mixed|string $ext_name 扩展名 - * @throws ConfigException - */ - private static function readConfigFromFile($filename, $ext_name): array - { - logger()->debug('正加载配置文件 ' . $filename); - switch ($ext_name) { - case 'php': - $r = require $filename; - if (is_array($r)) { - return $r; - } - throw new ConfigException('E00079', 'php配置文件include失败,请检查终端warning错误'); - case 'json': - default: - $r = json_decode(file_get_contents($filename), true); - if (is_array($r)) { - return $r; - } - throw new ConfigException('E00079', 'json反序列化失败,请检查文件内容'); - } - } -}