ckr/config

简单访问多维数组,适用于配置数据

2.0.0-beta.2 2016-04-03 16:02 UTC

This package is not auto-updated.

Last update: 2024-09-14 16:50:19 UTC


README

Build Status

此包提供了一个用于管理层次化数据的类。一个常见的用例是配置数据。

注意:此包不提供任何用于不同格式配置文件的读取器或写入器。相反,它封装PHP数组,并提供对其值的更简单访问

为什么?

我厌倦了在所有代码中使用太多的isset。这个库的主要优点是,您可以请求任意深层的值,并提供一个默认值,在请求的值不存在时返回该默认值。

$myConfig = [
  'root' => [
    'specific' => ['key' => 'val'],
  ],
];

// plain php is a bit ugly...
$theSpecific = isset($myConfig['root']['specific']['key']) ?
     $myConfig['root']['specific']['key'] : null;

$theGeneral = isset($myConfig['root']['key']) ?
     $myConfig['root']['key'] : false;

// ... but with a `Config` it looks nicer:
$config = new Ckr\Config\Config($myConfig);
$theSpecific = $config->get('root/specific/key');
$theGeneral = $config->get('root/key', false);

实际上,如果您使用PHP7,这个问题已经解决了

// valid code in PHP7
$theSpecific= $myConfig['root']['specific']['key'] ?? null;
$theGeneral = $myConfig['root']['key'] ?? false;

然而,由于我更喜欢将路径指定为root/specific/key而不是['root']['specific']['key'],我仍然在我的PHP7项目中使用这个库。

用法

您从一个层次化数据结构开始,定义为多维数组

$myConfig = [
  'mode' => 'production',
  'logging' => [
    'factory' => 'Your\\Logging\\Factory',
    'loggers' => [
      [
        'type' => 'file',
        'path' => '/path/to/logs',
        'level' => 'warn',
      ],
      [
        'type' => 'email',
        'addr' => 'someone@somewhere.com',
        'level' => 'critical',
      ]
    ],
  ]
];

然后您可以将它包装在一个Config对象中

use Ckr\Config\Config;

$c = new Config($myConfig);

您可以使用get请求一个简单的值

$mode = $c->get('mode', 'dev');

在上面的示例中,“dev”是默认模式。如果配置数据中不存在“mode”键,则返回它。

您可以通过提供由斜杠/分隔的键路径来请求嵌套在子数组中的值

$loggingFactoryClass = $c->get('logging/factory');

如果使用的路径部分(键)中的任何一个不存在,则返回默认值(如果没有明确指定则为null)。

假设您想使用所有的logging数据,例如,实例化您的日志实例。为此,您可以获取一个子配置对象

$loggingConfig = $c->child('logging'); /* @var $loggingConfig Config */

// we can now provide only the relevant data to thr logging factory
$myLoggingFactory = new $loggingFactoryClass;
$logger = $myLoggingFactory->create($loggingConfig);

// the logging factory "sees" only the data of the "logging" child array
public function create(Config $cfg)
{
  $loggers = $cfg->get('loggers'); // $loggers is an array
  foreach ($loggers as $logger) { /* ... */ }
  // ...
}

总结

  • Config::get始终返回原始定义的值。无论该值是数组、类实例、函数还是标量值。
  • Config::child期望给定的路径指向一个(关联)数组。它将此数组封装在Config中,并返回该对象。

可以使用Config::set设置新值

$newConfig = $c->set('logging/factory', 'AnotherFactoryClass');

此方法返回一个新实例,其中配置的特定部分已更新(或新设置)。如果您想从代码的不同部分逐步构建完整的配置对象,这可能很有用,例如,允许不同的模块注册其配置或工厂。在上面的示例中,$newConfig在路径logging/factory上的值为'AnotherFactoryClass',而$c实例被修改,仍然具有旧值。(注意,这种行为是从版本2.0开始的新行为,旧版本是在原地更新数据)。