charcoal/config

Charcoal 配置数据和对象建模组件

v5.0.0 2024-03-13 15:05 UTC

README

Config 包提供了组织配置数据和设计对象数据模型的抽象工具。

安装

composer require charcoal/config

概述

实体 & 配置

Config 组件简化了对对象数据的访问。它提供了一个基于属性的用户界面,用于在应用程序代码中检索和存储任意数据。数据被组织成两种主要对象类型:实体和配置。

实体

实体代表简单的数据对象容器,设计为灵活的领域模型对象的基础。
示例:存储库的单个结果或作为 MVC 系统每个组件的基础。

配置

配置是高级实体,专为运行时配置值设计,支持加载文件和存储分层数据。
示例:应用程序首选项、服务选项和工厂设置。

  • : Charcoal\Config\AbstractConfig
    • IteratorAggregate
    • Psr\Container\ContainerInterface
  • 方法: defaults, merge, addFile
  • 接口: Charcoal\Config\ConfigInterface
    • Charcoal\Config\EntityInterface
    • Charcoal\Config\FileAwareInterface
    • Charcoal\Config\SeparatorAwareInterface
    • Charcoal\Config\DelegatesAwareInterface

特性

文件加载器

Config 容器目前支持四种文件格式:INI、JSON、PHP 和 YAML。

可以通过 addFile($path) 方法或将文件直接实例化将配置文件导入到 Config 对象中。

use Charcoal\Config\GenericConfig as Config;

$cfg = new Config('config.json');
$cfg->addFile('config.yml');

文件扩展名将用于确定如何导入文件。文件将被解析,如果它是一个数组,它将被合并到容器中。

如果您想加载配置文件而不将其内容添加到 Config 中,请使用 loadFile($path) 代替。无论它是一个数组还是其他,文件都将被解析并返回。

$data = $cfg->loadFile('config.php');

请参阅文档示例以获取更多信息。

键分隔符查找

可以使用键分隔符在多维数组中查找、检索、分配或合并值。

在 Config 对象中,默认分隔符是点字符(.)。可以通过 separator() 方法检索令牌,并使用 setSeparator() 方法自定义。

use Charcoal\Config\GenericConfig as Config;

$cfg = new Config();
$cfg->setSeparator('/');
$cfg->setData([
    'database' => [
        'params' => [
            'name' => 'mydb',
            'user' => 'myname',
            'pass' => 'secret',
        ]
    ]
]);

echo $cfg['database/params/name']; // "mydb"

请参阅文档以获取更多信息。

委托查找

委托允许多个对象共享值,并在当前对象无法解析给定的数据键时充当后备。

在配置对象中,委托对象被注册到内部堆栈中。如果一个数据键无法解析,配置对象会遍历堆栈中的每个委托对象,并在第一个包含非NULL值的匹配项处停止。

use Charcoal\Config\GenericConfig as Config;

$cfg = new Config([
    'driver' => null,
    'host'   => 'localhost',
]);
$delegate = new Config([
    'driver' => 'pdo_mysql',
    'host'   => 'example.com',
    'port'   => 11211,
]);

$cfg->addDelegate($delegate);

echo $cfg['driver']; // "pdo_mysql"
echo $cfg['host']; // "localhost"
echo $cfg['port']; // 11211

有关更多信息,请参阅文档

数组访问

实体对象实现了ArrayAccess接口,因此可以使用数组风格使用。

$cfg = new \Charcoal\Config\GenericConfig();

// Assigns a value to "foobar"
$cfg['foobar'] = 42;

// Returns 42
echo $cfg['foobar'];

// Returns TRUE
isset($cfg['foobar']);

// Returns FALSE
isset($cfg['xyzzy']);

// Invalidates the "foobar" key
unset($cfg['foobar']);

👉 数据键必须是一个字符串,否则会抛出InvalidArgumentException异常。

互操作性

配置对象实现了PSR-11: Psr\Container\ContainerInterface

此接口公开了两个方法:get()has()。这些方法由实体对象作为ArrayAccess::offsetGet()ArrayAccess::offsetExists()的别名实现。

$config = new \Charcoal\Config\GenericConfig([
    'foobar' => 42
]);

// Returns 42
$config->get('foobar');

// Returns TRUE
$config->has('foobar');

// Returns FALSE
$config->has('xyzzy');

👉 使用不存在键调用get()方法不会抛出异常。

可配置对象

本包还提供了一种可配置混入(mixin)。

  • Charcoal\Config\ConfigrableInterface
  • Charcoal\Config\ConfigurableTrait

可配置对象(可能被称为“配置感知”)可以关联一个配置对象,这有助于定义各种属性、状态或其他。

可以通过setConfig()分配配置对象,通过config()检索。

ConfigurableTrait的一个额外好处是createConfig($data)方法,该方法用于在没有分配的情况下创建一个配置对象。此方法可以在子类中重写,以自定义返回的实例和可能需要的初始状态。

有关示例和更多信息,请参阅文档

资源