mtymek/expressive-config-manager

此包已被放弃且不再维护。作者建议使用 zendframework/zend-config-aggregator 包。

轻量级库,用于合并和缓存应用程序配置

0.4.0 2016-03-17 16:35 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.phpdatabase.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-configzendframework/zend-servicemanager。一些配置读取器(JSON、YAML)可能需要额外的依赖项 - 请参考 Zend Config 手册 了解更多详情。