radiergummi / libconfig
为PHP应用程序创建配置对象
Requires
- php: >=5.3.0
This package is auto-updated.
Last update: 2024-08-29 03:17:53 UTC
README
一个简单的PHP类,用于创建键值存储。基本上,你可以直接将配置抛给它,无论是数组、json、文件还是目录,libconfig都会以直观的方式使其可访问。你可以 get、set 和 add 它,计数它,迭代它或将其作为数组访问。每种方法都有其独特的技巧。下面将详细介绍。
注意:我还制作了一个单例版本,可在以下位置找到:这里。
为什么?因为在不创建实例的情况下使用像Config::get('key')这样的东西非常方便。
安装
###通过Composer(Packagist)安装
-
在你的 composer.json 文件中包含以下内容
"require": { ... "radiergummi\libconfig": "~1.0" } -
然后,运行
php composer.phar install
###通过源代码安装
- 从 Github 下载
- 将 src/libconfig 文件夹放入你的代码库中的
vendor/Radiergummi(你不需要父文件夹) - 使用 PSR-4 自动加载器 包含它!
用法
创建Config对象
创建一个配置对象,如下所示
$config = new Config($data);
其中 $data 可以是一个数组或一个json字符串,一个文件或文件夹路径。
使用文件作为参数创建Config对象
要直接包含json文件,使用
$config = new Config(PATH . 'example.json');
唯一的要求是完整的路径必须是有效的。
我经常使用像下面的php文件来存储配置。所以你也可以使用
$config = new Config(PATH . 'example.php');
PHP配置文件
<? return array( 'foo' => 'bar' );
使用文件夹作为参数创建Config对象
要解析包含你的配置文件的文件夹,使用
$config = new Config(PATH . 'app/config');
唯一的要求是完整的路径必须是有效的。
关于INI文件的说明:老实说,当你有php和json时,为什么还要使用那些进行配置呢?也许当我找到一个优雅实现它的好方法时。
实现建议
将其整合到你的项目中: 设置命名空间为你的应用程序的命名空间,并将其保存在应用程序系统目录中。这样,你可以以最简便的方式访问配置。
捕获可能的异常: 如果数据无法读取,libconfig会立即抛出RuntimeException。如果你知道某些 可能 会出错,请设置try-catch块。
不要使用硬编码: 尽可能使用配置文件 - 对于文件、路由、i18n、路径和类列表等。
合理使用: 到了某一点,redis或真正的数据库可能更有意义。不时重新评估。
随意修改代码: 你可以自由地将这个库用于任何项目,无论是商业的还是非商业的(请参阅许可)。然而,如果你能通知我你如何使用我的工作以及你做了哪些更改,那将非常感谢 :).
方法
set
将值插入到键中
$config->set('foo', 'bar');
这将向配置数组添加以下内容
Array
(
[foo] => bar
)
要设置嵌套配置值,可以使用点来分隔键
$config->set('font.roboto.italic.regular', 'roboto-regular-italic.woff');
这将向配置数组添加以下内容
Array
(
[font] => Array
(
[roboto] => Array
(
[italic] => Array
(
[regular] => roboto-regular-italic.woff
)
)
)
)
get
返回给定键的值
$config->get('foo'); // bar
要访问嵌套的配置值,您可以使用点来分隔键
$fontlist = $config->get('font.roboto.italic'); // Array $fontfile = $config->get('font.roboto.italic.regular'); // roboto-regular-italic.woff
您可以可选地指定一个回退值,以防所需的键不存在
$config->get('app.server.port', '8080');
要获取整个配置,只需不带参数调用get
$config->get();
has
检查设置是否存在
$config->has('foo.sub.key'); // true
erase
从设置中删除一个键
$config->erase('foo.sub.key');
add
将另一个数组添加到配置中。数据将被合并,这意味着具有相同名称的键将覆盖之前存在的键。也许应该在这里实现将它们以更改的名称插入的功能?
$config->add(file_get_contents('another.json'));
魔法方法
__tostring
返回完整的数据数组
print_r($config); // Array
(注意:这是多余的。您可以调用$config->get()或直接调用$config,效果相同。我认为它不是很自我文档化,但我是谁,能告诉你如何编程呢?)
实现接口
数组访问
您也可以作为数组访问和编辑所有数据
$port = $config['app']['server']['port']; // 8080
Countable
Config对象可以被计数
$settings = count($config);
Iterator
您能够遍历Config对象
array_walk_recursive($config, function ($value, $key) {
echo "$key holds $value\n";
});
关于异常的一些想法
我在整个libconfig中只实现了RuntimeException作为异常类型。为什么?可能出现的问题包括找不到文件或数据不可解析。在任何情况下,您都遇到了一个问题,应该捕获它
try { $config->add('inexistent/path/to/file.json'); } catch (Exception $e) { $app->shutdown(502); if (ENV === 'dev') throw new \MyApp\Exceptions\FileNotFoundException($e); }
这样,异常处理就绑定到您的应用程序上了,您不需要处理更多任意的异常类型。
TODO
Bugs
- 递归地计数对象目前没有效果,我不知道为什么。
有时在解析JSON时,会抛出JSON_LAST_ERROR 1,表示达到最大深度,即使处理没有嵌套的JSON。一定有某些递归发生。(已修复)
改进
- 代码的部分比较混乱,特别是
add方法。 - 我希望稍微模块化一下内部结构——解析输入应通过驱动程序完成,或者至少在每种内容类型的专用方法内完成。(进行中)
libconfig应该进行单元测试(已完成)
功能
- INI支持(但只是为了保持竞争力)(进行中)
- ?
如何贡献
我很乐意看到其他人将他们的想法贡献给这个项目。但是为了简化流程,请记住以下几点
- 如果您发现了一个错误,请为它创建一个问题,用bug标签标记它,并包括用于重现错误的代码。
- 如果您想请求或讨论一个功能,请为它创建一个问题,用enhancement标签标记它,并尽可能详细地描述。
- 如果您想贡献实际的代码,请fork存储库,在您的fork中创建一个新的分支(例如feature-ini-support),在其中进行更改,并创建一个pull请求。
谢谢!