mirror of
https://github.com/zhamao-robot/zhamao-framework.git
synced 2026-07-24 00:55:35 +08:00
Merge pull request #225 from zhamao-robot/refactor-config-config
重构配置类配置
This commit is contained in:
3
.gitignore
vendored
3
.gitignore
vendored
@@ -82,3 +82,6 @@ package-lock.json
|
|||||||
/.tool-version
|
/.tool-version
|
||||||
|
|
||||||
.DS_Store
|
.DS_Store
|
||||||
|
|
||||||
|
### PHP CS Fixer ###
|
||||||
|
.php-cs-fixer.cache
|
||||||
|
|||||||
@@ -71,5 +71,6 @@ return (new PhpCsFixer\Config())
|
|||||||
PhpCsFixer\Finder::create()
|
PhpCsFixer\Finder::create()
|
||||||
->in(__DIR__ . '/src')
|
->in(__DIR__ . '/src')
|
||||||
->in(__DIR__ . '/tests')
|
->in(__DIR__ . '/tests')
|
||||||
)
|
->in(__DIR__ . '/config')
|
||||||
->setUsingCache(false);
|
->in(__DIR__ . '/bin')
|
||||||
|
);
|
||||||
|
|||||||
@@ -14,7 +14,7 @@
|
|||||||
"enabled": true,
|
"enabled": true,
|
||||||
"actions": [
|
"actions": [
|
||||||
{
|
{
|
||||||
"action": "composer cs-fix -- {$STAGED_FILES|of-type:php} --dry-run",
|
"action": "composer cs-fix -- --config=.php-cs-fixer.php --dry-run --diff {$STAGED_FILES|of-type:php}",
|
||||||
"conditions": [
|
"conditions": [
|
||||||
{
|
{
|
||||||
"exec": "\\CaptainHook\\App\\Hook\\Condition\\FileStaged\\OfType",
|
"exec": "\\CaptainHook\\App\\Hook\\Condition\\FileStaged\\OfType",
|
||||||
|
|||||||
28
config/config.php
Normal file
28
config/config.php
Normal file
@@ -0,0 +1,28 @@
|
|||||||
|
<?php
|
||||||
|
|
||||||
|
declare(strict_types=1);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Config 配置类的配置文件
|
||||||
|
* 由于 Config 类是第一批被加载的类,因此本文件存在以下限制:
|
||||||
|
* 1. 只能使用 PHP 格式
|
||||||
|
* 2. 无法利用容器及依赖注入
|
||||||
|
* 3. 必须存在于本地,无法使用远程配置(后续版本可能会支持)
|
||||||
|
*/
|
||||||
|
return [
|
||||||
|
'repository' => [
|
||||||
|
\OneBot\Config\Repository::class, // 配置仓库,须实现 \OneBot\Config\RepositoryInterface 接口
|
||||||
|
[], // 传入的参数,依序传入构造函数
|
||||||
|
],
|
||||||
|
'loader' => [
|
||||||
|
\OneBot\Config\Loader\DelegateLoader::class, // 配置加载器,须实现 \OneBot\Config\LoaderInterface 接口
|
||||||
|
[], // 传入的参数,依序传入构造函数
|
||||||
|
],
|
||||||
|
'source' => [
|
||||||
|
'extensions' => ['php', 'yaml', 'yml', 'json', 'toml'], // 配置文件扩展名
|
||||||
|
'paths' => [
|
||||||
|
SOURCE_ROOT_DIR . '/config', // 配置文件所在目录
|
||||||
|
// 可以添加多个配置文件目录
|
||||||
|
],
|
||||||
|
],
|
||||||
|
];
|
||||||
@@ -5,6 +5,7 @@ declare(strict_types=1);
|
|||||||
namespace ZM\Config;
|
namespace ZM\Config;
|
||||||
|
|
||||||
use OneBot\Config\Config;
|
use OneBot\Config\Config;
|
||||||
|
use OneBot\Config\Loader\LoaderInterface;
|
||||||
use OneBot\Util\Singleton;
|
use OneBot\Util\Singleton;
|
||||||
use ZM\Exception\ConfigException;
|
use ZM\Exception\ConfigException;
|
||||||
use ZM\Framework;
|
use ZM\Framework;
|
||||||
@@ -13,21 +14,11 @@ class ZMConfig
|
|||||||
{
|
{
|
||||||
use Singleton;
|
use Singleton;
|
||||||
|
|
||||||
/**
|
|
||||||
* @var array 支持的文件扩展名
|
|
||||||
*/
|
|
||||||
public const ALLOWED_FILE_EXTENSIONS = ['php', 'yaml', 'yml', 'json', 'toml'];
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var array 配置文件加载顺序,后覆盖前
|
* @var array 配置文件加载顺序,后覆盖前
|
||||||
*/
|
*/
|
||||||
public const LOAD_ORDER = ['default', 'environment', 'patch'];
|
public const LOAD_ORDER = ['default', 'environment', 'patch'];
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string 默认配置文件路径
|
|
||||||
*/
|
|
||||||
public const DEFAULT_CONFIG_PATH = SOURCE_ROOT_DIR . '/config';
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string[] 环境别名
|
* @var string[] 环境别名
|
||||||
*/
|
*/
|
||||||
@@ -42,6 +33,11 @@ class ZMConfig
|
|||||||
*/
|
*/
|
||||||
private array $loaded_files = [];
|
private array $loaded_files = [];
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var array 配置文件扩展名
|
||||||
|
*/
|
||||||
|
private array $file_extensions = [];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var array 配置文件路径
|
* @var array 配置文件路径
|
||||||
*/
|
*/
|
||||||
@@ -62,24 +58,42 @@ class ZMConfig
|
|||||||
*/
|
*/
|
||||||
private ?ConfigTracer $tracer = null;
|
private ?ConfigTracer $tracer = null;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @var LoaderInterface 配置加载器
|
||||||
|
* @phpstan-ignore-next-line We will use this property in the future.
|
||||||
|
*/
|
||||||
|
private LoaderInterface $loader;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 构造配置实例
|
* 构造配置实例
|
||||||
*
|
*
|
||||||
* @param array $config_paths 配置文件路径
|
|
||||||
* @param string $environment 环境
|
* @param string $environment 环境
|
||||||
*
|
*
|
||||||
* @throws ConfigException 配置文件加载出错
|
* @throws ConfigException 配置文件加载出错
|
||||||
*/
|
*/
|
||||||
public function __construct(array $config_paths = [], string $environment = 'uninitiated')
|
public function __construct(string $environment = 'uninitiated', array $init_config = null)
|
||||||
{
|
{
|
||||||
$this->config_paths = $config_paths ?: [self::DEFAULT_CONFIG_PATH];
|
$conf = $init_config ?: $this->loadInitConfig();
|
||||||
|
$this->file_extensions = $conf['source']['extensions'];
|
||||||
|
$this->config_paths = $conf['source']['paths'];
|
||||||
|
|
||||||
$this->environment = self::$environment_alias[$environment] ?? $environment;
|
$this->environment = self::$environment_alias[$environment] ?? $environment;
|
||||||
$this->holder = new Config([]);
|
|
||||||
|
// 初始化配置容器
|
||||||
|
$this->holder = new Config(
|
||||||
|
new ($conf['repository'][0])(...$conf['repository'][1]),
|
||||||
|
);
|
||||||
|
|
||||||
|
// 初始化配置加载器
|
||||||
|
$this->loader = new ($conf['loader'][0])(...$conf['loader'][1]);
|
||||||
|
|
||||||
|
// 调试模式下启用配置跟踪器
|
||||||
if (Framework::getInstance()->getArgv()['debug'] ?? false) {
|
if (Framework::getInstance()->getArgv()['debug'] ?? false) {
|
||||||
$this->tracer = new ConfigTracer();
|
$this->tracer = new ConfigTracer();
|
||||||
} else {
|
} else {
|
||||||
$this->tracer = null;
|
$this->tracer = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($environment !== 'uninitiated') {
|
if ($environment !== 'uninitiated') {
|
||||||
$this->loadFiles();
|
$this->loadFiles();
|
||||||
}
|
}
|
||||||
@@ -104,7 +118,7 @@ class ZMConfig
|
|||||||
foreach ($files as $file) {
|
foreach ($files as $file) {
|
||||||
[, $ext, $load_type] = $this->getFileMeta($file);
|
[, $ext, $load_type] = $this->getFileMeta($file);
|
||||||
// 略过不支持的文件
|
// 略过不支持的文件
|
||||||
if (!in_array($ext, self::ALLOWED_FILE_EXTENSIONS, true)) {
|
if (!in_array($ext, $this->file_extensions, true)) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -347,12 +361,14 @@ class ZMConfig
|
|||||||
|
|
||||||
// 判断文件格式是否支持
|
// 判断文件格式是否支持
|
||||||
[$group, $ext, $load_type, $env] = $this->getFileMeta($path);
|
[$group, $ext, $load_type, $env] = $this->getFileMeta($path);
|
||||||
if (!in_array($ext, self::ALLOWED_FILE_EXTENSIONS, true)) {
|
if (!in_array($ext, $this->file_extensions, true)) {
|
||||||
throw ConfigException::unsupportedFileType($path);
|
throw ConfigException::unsupportedFileType($path);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 读取并解析配置
|
// 读取并解析配置
|
||||||
$content = file_get_contents($path);
|
$content = file_get_contents($path);
|
||||||
|
// TODO: 使用 Loader 替代
|
||||||
|
// $config = $this->loader->load($path);
|
||||||
$config = [];
|
$config = [];
|
||||||
switch ($ext) {
|
switch ($ext) {
|
||||||
case 'php':
|
case 'php':
|
||||||
@@ -396,8 +412,11 @@ class ZMConfig
|
|||||||
$this->merge($group, $config);
|
$this->merge($group, $config);
|
||||||
logger()->debug("已载入配置文件:{$path}");
|
logger()->debug("已载入配置文件:{$path}");
|
||||||
|
|
||||||
if ($this->tracer !== null) {
|
$this->tracer?->addTracesOf($group, $config, $path);
|
||||||
$this->tracer->addTracesOf($group, $config, $path);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private function loadInitConfig(): array
|
||||||
|
{
|
||||||
|
return require SOURCE_ROOT_DIR . '/config/config.php';
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,9 +56,9 @@ class ZMConfigTest extends TestCase
|
|||||||
]);
|
]);
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$config = new ZMConfig([
|
$init_conf = require SOURCE_ROOT_DIR . '/config/config.php';
|
||||||
$this->vfs->url(),
|
$init_conf['source']['paths'] = [$this->vfs->url()];
|
||||||
], 'development');
|
$config = new ZMConfig('development', $init_conf);
|
||||||
} catch (ConfigException $e) {
|
} catch (ConfigException $e) {
|
||||||
$this->fail($e->getMessage());
|
$this->fail($e->getMessage());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,7 +24,9 @@ class ZMRequestTest extends TestCase
|
|||||||
|
|
||||||
public function testGet()
|
public function testGet()
|
||||||
{
|
{
|
||||||
$r = ZMRequest::get('http://ip.zhamao.xin');
|
$r = ZMRequest::get('http://httpbin.org/get', [
|
||||||
$this->assertStringContainsString('114', $r);
|
'X-Test' => '123',
|
||||||
|
]);
|
||||||
|
$this->assertStringContainsString('123', $r);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user