radiergummi/libconfig

为PHP应用程序创建配置对象

v1.0 2015-06-04 13:02 UTC

This package is auto-updated.

Last update: 2024-08-29 03:17:53 UTC


README

一个简单的PHP类,用于创建键值存储。基本上,你可以直接将配置抛给它,无论是数组、json、文件还是目录,libconfig都会以直观的方式使其可访问。你可以 getsetadd 它,计数它,迭代它或将其作为数组访问。每种方法都有其独特的技巧。下面将详细介绍。
 

注意:我还制作了一个单例版本,可在以下位置找到:这里
为什么?因为在不创建实例的情况下使用像 Config::get('key') 这样的东西非常方便。

安装

###通过Composer(Packagist)安装

  1. 在你的 composer.json 文件中包含以下内容

     "require": {
         ...
         "radiergummi\libconfig": "~1.0"
     }
    
  2. 然后,运行 php composer.phar install

###通过源代码安装

  1. Github 下载
  2. src/libconfig 文件夹放入你的代码库中的 vendor/Radiergummi (你不需要父文件夹)
  3. 使用 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请求。

谢谢!