ckr / config
简单访问多维数组,适用于配置数据
Requires
- php: >=5.5.0
- ckr/arraymerger: ^2.0.0
Requires (Dev)
- phpspec/phpspec: ~2.3
- phpunit/phpunit: ~4.8
This package is not auto-updated.
Last update: 2024-09-14 16:50:19 UTC
README
此包提供了一个用于管理层次化数据的类。一个常见的用例是配置数据。
注意:此包不提供任何用于不同格式配置文件的读取器或写入器。相反,它封装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开始的新行为,旧版本是在原地更新数据)。