mtymek / expressive-config-manager
Requires
- php: ^5.5 || ^7.0
Requires (Dev)
Suggests
- zendframework/zend-config: Allows loading configuration from XML, INI, YAML and JSON files
- zendframework/zend-stdlib: Allows removing configuration keys and globbing on Windows platform
This package is auto-updated.
Last update: 2022-02-01 12:53:33 UTC
README
已弃用! 此库已被合并到 Zend Framework 组织中,作为 zend-config-aggregator - 请使用它。
轻量级库,用于收集和合并来自不同来源的配置。
它专为 zend-expressive 应用程序设计,但可以与任何 PHP 项目一起工作。
使用方法
配置文件
在基本层面上,ConfigManager 可以用于合并基于 PHP 的配置文件
use Zend\Expressive\ConfigManager\ConfigManager; use Zend\Expressive\ConfigManager\PhpFileProvider; $configManager = new ConfigManager( [ new PhpFileProvider('*.global.php'), ] ); var_dump($configManager->getMergedConfig());
每个文件应返回一个纯 PHP 数组
// db.global.php return [ 'db' => [ 'dsn' => 'mysql:...', ], ]; // cache.global.php return [ 'cache_storage' => 'redis', 'redis' => [ ... ], ];
结果
array(3) { 'db' => array(1) { 'dsn' => string(9) "mysql:..." } 'cache_storage' => string(5) "redis" 'redis' => array(0) { ... } }
配置按传递的顺序合并,较后项具有优先权。
配置提供者
ConfigManager 通过在创建对象时传递“配置提供者”来工作。每个提供者应是一个可调用的函数,返回要合并的配置数组(或生成器)。
$configManager = new ConfigManager( [ function () { return ['foo' => 'bar']; }, new PhpFileProvider('*.global.php'), ] ); var_dump($configManager->getMergedConfig());
如果提供者是类名,它将自动实例化。这可以用来模仿 ZF2 模块系统 - 您可以从不同的包中指定配置类的列表,聚合的配置将可用于您的应用程序。或者,作为库所有者,您可以分发具有默认值的配置类。
示例
class ApplicationConfig { public function __invoke() { return ['foo' => 'bar']; } } $configManager = new ConfigManager( [ ApplicationConfig::class, new PhpFileProvider('*.global.php'), ] ); var_dump($configManager->getMergedConfig());
两个示例的输出将相同
array(4) { 'foo' => string(3) "bar" 'db' => array(1) { 'dsn' => string(9) "mysql:..." } 'cache_storage' => string(5) "redis" 'redis' => array(0) { } }
缓存
为了启用配置缓存,将缓存文件名作为第二个参数传递给 ConfigManager
构造函数
$configManager = new ConfigManager( [ function () { return [ConfigManager::ENABLE_CACHE => true]; }, new PhpFileProvider('*.global.php'), ], 'data/config-cache.php' );
当指定缓存文件时,您还需要将 config_cache_enabled
键添加到配置中,并将其设置为 TRUE
(使用 ConfigManager::ENABLE_CACHE
常量以提高便利性)。这允许通过在配置目录中放置额外的 *.local.php
文件来启用部署期间的缓存。
return [ ConfigManager::ENABLE_CACHE` => true, ];
当启用缓存时,ConfigManager
不会迭代配置提供者。因此,它非常快,但一旦启用,就不能对配置进行任何更改,除非清除缓存。**缓存应仅在生产环境中使用**,并且您的部署过程应清除缓存。
生成器
配置提供者可以编写为生成器。这种方式下,单个可调用函数可以提供多个配置
$configManager = new ConfigManager( [ function () { foreach (Glob::glob('data/*.global.php', Glob::GLOB_BRACE) as $file) { yield include $file; } } ] ); var_dump($configManager->getMergedConfig());
PhpFileProvider
使用生成器实现。
可用的配置提供者
PhpFileProvider
从返回数组的 PHP 文件中加载配置,如下所示
return [ 'db' => [ 'dsn' => 'mysql:...', ], ];
支持通配符
$configManager = new ConfigManager( [ new PhpFileProvider('config/*.global.php'), ] );
上面的示例将合并来自 config
目录下的所有匹配文件 - 如果你有以下文件如 app.global.php
、database.global.php
,它们将通过这几行代码被加载。
内部使用 ZendStdlib\Glob
处理通配符解析,这意味着你可以使用更复杂的模式(例如:'config/autoload/{{,*.}global,{,*.}local}.php'
),在 Windows 平台上也能正常工作。
ZendConfigProvider
有时候使用纯 PHP 文件可能不够,你可能想要从多种格式的多个文件中构建你的配置:INI、YAML 或 XML。为此,你可以利用 ZendConfigProvider
。
$configManager = new ConfigManager( [ new ZendConfigProvider('*.global.json'), new ZendConfigProvider('database.local.ini'), ] );
ZendConfigProvider
接受通配符,并自动根据文件扩展名检测配置类型。
ZendConfigProvider
需要安装两个包:zendframework/zend-config
和 zendframework/zend-servicemanager
。一些配置读取器(JSON、YAML)可能需要额外的依赖项 - 请参考 Zend Config 手册 了解更多详情。