phossa2/config

此包已被废弃,不再维护。未建议替代包。

一个简单、易于使用但功能强大的PHP配置管理库。

2.0.12 2016-07-18 02:20 UTC

This package is not auto-updated.

Last update: 2020-01-24 16:17:57 UTC


README

请使用 phoole/config 库代替

Build Status Code Quality Code Climate PHP 7 ready HHVM Latest Stable Version License

phossa2/config 是一个简单、易于使用但功能强大的PHP配置管理库。其设计灵感来自另一个github项目 mrjgreen/config,但增加了许多酷炫的功能。

它需要PHP 5.4,支持PHP 7.0+和HHVM。它符合 PSR-1PSR-2PSR-4

安装

通过 composer 工具安装。

composer require "phossa2/config=2.*"

或者在您的 composer.json 文件中添加以下行

{
    "require": {
       "phossa2/config": "2.*"
    }
}

功能

  • 简单的接口,get($id, $default = null)has($id)

  • 一个集中地点用于管理所有配置文件。

    config/
     |
     |___ production/
     |       |
     |       |___ host1/
     |       |      |___ db.php
     |       |      |___ redis.php
     |       |
     |       |___ db.php
     |
     |___ dev/
     |     |
     |     |___ redis.php
     |     |___ db.php
     |
     |___ db.php
     |___ redis.php
     |___ system.php
    
  • 使用 环境 值,例如 productionproduction/host1 来在不同配置之间切换。

  • 完全支持配置值中的 引用,例如 ${system.tmpdir}

  • 按需配置加载(懒加载)。

  • 使用点表示法如 db.auth.host 的层次结构配置结构。

  • 数组访问 以便于使用。例如 $config['db.user'] = 'www';

  • 引用查找 委派 和配置链。

  • 支持 .php.json.ini.xml.serialized 类型的配置文件。

用法

  • 使用环境值

    通常应用运行环境在不同服务器上可能不同。一种好的做法是在主机上的某个位置设置环境变量,并将所有配置文件放在一个集中的 config/ 目录中。

    一个示例 .env 文件,

    # installation base
    BASE_DIR=/www
    
    # app directory
    APP_DIR=${BASE_DIR}/app
    
    # config directory
    CONFIG_DIR=${APP_DIR}/config
    
    # app env for current host
    APP_ENV=production/host1

    在一个示例 bootstrap.php 文件中,

    use Phossa2\Config\Config;
    use Phossa2\Env\Environment;
    use Phossa2\Config\Loader\ConfigFileLoader;
    
    // load environment from '.env' file
    (new Environment())->load(__DIR__ . '/.env');
    
    // create config instance with the config file loader
    $config = new Config(
        new ConfigFileLoader(
            getenv('CONFIG_DIR'),
            getenv('APP_ENV')
        )
    );
    
    // object access of $config
    $db_config = $config->get('db');
    
    // array access of $config
    $config['db.user'] = 'www';
  • 集中配置目录和配置分组

    • 配置分组

      将配置收集到一个目录中,并按文件和子目录分组,以便于管理。

      例如,config/system.php 包含 system.* 配置

      // system.php
      return [
          'tmpdir' => '/usr/local/tmp',
          // ...
      ];

      稍后,可以通过以下方式检索与 system 相关的配置

      // object acess of config
      $dir = $config->get('system.tmpdir');
      
      // array access of $config
      $dir = $config['system.tmpdir'];

      或者在其他配置中使用 引用

    • 配置文件加载顺序

      如果环境设置为 production/host1,则配置文件的加载顺序为,

      1. config/config/*.php

      2. config/production/*.php

      3. config/production/host1/*.php

      配置值将被覆盖,并替换那些后来加载的文件中的值。

  • 引用的使用

    引用可以让你轻松管理配置。

    例如,在 system.php

    // group: system
    return [
        'tmpdir' => '/var/local/tmp',
        ...
    ];

    在你的 cache.php 文件中,

    // group: cache
    return [
        // a local filesystem cache driver
        'local' => [
            'driver' => 'filesystem',
            'params' => [
                'root_dir'   => '${system.tmpdir}/cache', // use reference here
                'hash_level' => 2
            ]
        ],
        ...
    ];

    你可以按照以下方式重置引用的开始和结束匹配模式,

    // now reference is something like '%{system.tmpdir}%'
    $config->setReferencePattern('%{', '}%');
  • ArrayAccess 和 DOT 表示法

    Config 类实现了 ArrayAccess 接口。因此,配置值可以像数组一样访问。

    // test
    if (!isset($config['db.auth.user'])) {
        // set
        $config['db.auth.user'] = 'www';
    }

    使用点表示法如 db.auth.host 的层次结构配置结构。

    // returns the db config array
    $db_config = $config->get('db');
    
    // returns a string
    $db_host = $config->get('db.auth.host');

    既支持扁平表示法,也支持数组表示法,并且可以同时存在。

    // db config file
    return [
        // array notation
        'auth' => [
            'host' => 'localhost',
            'port' => 3306
        ],
    
        // flat notation
        'auth.user' => 'dbuser'
    ];
  • 引用查找委托和配置链

    • 配置委托

      引用查找委托类似于 Interop Container Delegate Lookup 的委托理念

      • get() 方法的调用应仅返回配置注册表中的条目。如果条目不是注册表的一部分,则返回 NULL,如 ConfigInterface 中所述。

      • has() 方法的调用应仅在条目是配置注册表的一部分时返回 true。如果条目不是注册表的一部分,则应返回 false。

      • 如果获取的条目有依赖项(引用),则 代替 在此配置注册表中执行引用查找,而是在委托器上执行查找。

      • 重要 默认情况下,查找 应该 仅在委托器上执行,而不是在配置注册表本身上。

        $config1 = new Config();
        $config2 = new Config();
        $delegator = new Delegator();
        
        // add some values
        $config1['db.user'] = '${system.user}';
        $config2['system.user'] = 'root';
        
        // reference unresolved in $config1
        var_dump($config1['db.user'] === '${system.user}'); // true
        
        // add both configs to the delegator
        $delegator->addConfig($config1);
        $delegator->addConfig($config2);
        
        // reference resolved thru the delegator
        var_dump($config1['db.user'] === 'root'); // true

      Delegator 类实现了 ConfigInterfaceArrayAccess 接口,因此可以像普通配置一样使用。

      $dbUser = $delegator['db.user'];
    • 配置链

      通过多级委托可以实现配置链。例如,

      // configs
      $config1 = new Config();
      $config2 = new Config();
      
      // delegators
      $delegator1 = new Delegator();
      $delegator2 = new Delegator();
      
      // register $config1 with $delegator1
      $delegator1->addConfig($config1);
      
      // chaining
      $delegator2->addConfig($delegator1);
      $delegator2->addConfig($config2);
      
      // get from the chain
      $db = $delegator2->get('db');
    
    

APIs

  • ConfigInterface API

    • get(string $id, $default = null): mixed

      $default 在找不到配置值时使用。

      返回值可能是 stringarray 或甚至 object

    • has(string $id): bool

      测试 $id 是否存在。返回一个 boolean 值。

  • WritableInterface API

    • set(string $id, mixed $value): bool

      在此 会话 中手动设置配置。除非您手动修改配置文件,否则该值不会反映在任何配置文件中。

      $value 可能是 stringarrayobject

      可以通过以下方式禁用此功能:

      // disable writing to the $config
      $config->setWritable(false);
    • setWritable(bool $writable): bool

      启用或禁用 set() 功能。成功时返回 true

    • isWritable(): bool

      测试当前配置是否可写。

  • ReferenceInterface API

    • setReferencePattern(string $start, string $end): $this

      重置引用开始字符和结束字符。默认为 '${'}'

    • hasReference(string $string): bool

      测试 $string 中是否存在引用

    • deReference(string $string): mixed

      取消引用 $string 中的所有引用。结果可能是 stringarray 或甚至 object

    • deReferenceArray(mixed &$data): $this

      递归取消引用 $data 中的所有内容。 $data 可能是 stringarray。其他数据类型将被忽略并保持不变。

  • DelegatorInterface API

    • addConfig(ConfigInterface $config): $this

      向委托器添加一个 Phossa2\Config\Interfaces\ConfigInterface 实例。

  • 其他

    • setErrorType(int $type): $this

      请为配置设置 Config::ERROR_IGNOREConfig::ERROR_WARNINGConfig::ERROR_EXCEPTION

变更日志

请参阅CHANGELOG获取更多信息。

测试

$ composer test

贡献

请参阅CONTRIBUTE获取更多信息。

依赖

  • PHP >= 5.4.0

  • phossa2/shared >= 2.0.21

许可证

MIT许可证