khartir/typed-config

一个从类型类和数据数组创建有效配置对象的工具

v0.3.0 2021-04-10 08:11 UTC

This package is not auto-updated.

Last update: 2024-09-22 01:06:15 UTC


README

一个用于在PHP中创建类型配置的包

安装

composer require khartir/typed-config

用法

给定一些类,例如这样

class Config {

    private $foo;

    private $barConfig;

    public function __construct(string $foo, BarConfig $barConfig) {
        $this->foo = $foo;
        $this->barConfig = $barConfig;
    }
}

class BarConfig {

    private $value;

    public function __construct(string $value) {
        $this->value = $value;
    }
}

您可以创建填充的对象,例如这样

$builder = new \Khartir\TypedConfig\Builder();

$data = [
    ['barConfig' => ['value' => 'dummy']],
    ['foo' => 'bar'],
];

$config = $builder->build(Config::class, $data);

将 snake_case 键转换为 camelCase 配置

如果您的数组键是 snake_case 而您的属性是 camelCase,您可以添加一个转换器

$builder = new \Khartir\TypedConfig\Builder(new \Khartir\TypedConfig\Extractor\SnakeCaseExtractor());

扩展

编写自定义解析器

解析器确定从给定的值列表中参数的值。您可以编写自定义解析器以实现特殊逻辑。示例包含一个将字符串转换为 \DateTime-对象的自定义解析器。

class DateTimeResolver implements ResolverInterface
{
    public const DATE_FORMAT = 'Y-m-d H:i:s';

    public function canResolve(\ReflectionParameter $parameter): bool
    {
        return \in_array(
            ReflectionHelper::getTypeName($parameter),
            [\DateTimeImmutable::class, \DateTime::class],
            true
        );
    }

    public function resolve(\ReflectionParameter $parameter, array $values): \DateTimeInterface
    {
        $value  = \end($values);
        $class  = ReflectionHelper::getTypeName($parameter);
        $parsed = $class::createFromFormat(self::DATE_FORMAT, $value);

        if (false === $parsed) {
            throw InvalidArgumentException::createForParameter($value, $parameter);
        }

        return $parsed;
    }
}

测试

这个库允许的嵌套配置对象的一个问题是测试。特别是需要为所有值定义值,即使特定的测试只关心几个值。

因此,存在 DummyValueBuilder。只需像创建 Builder 一样实例化它即可。

您的配置值的确定遵循以下规则

  1. 如果您传入一个值,它将被使用,就像使用正常的 Builder 一样。
  2. 如果参数有默认值,则使用该值。

    可以通过调用 $dummyBuilder->useDefaultValue(false) 禁用此操作。

  3. 如果参数是可空的,则使用 null

    可以通过调用 $dummyBuilder->useNullable(false) 禁用此操作。

  4. 如果上述任何一项都不匹配,则使用与参数类型匹配的默认值。

    默认值的列表(作为 type => value 对)可以

    • 通过调用 setDefaultValues 覆盖
    • 通过调用 addDefaultValues 添加

    如果没有其他配置,则使用以下默认值

    [
     'int' => 0,
     'string' => '',
     'float' => 0.0,
     'array' => [],
     'bool' => false,
    ]