khartir / typed-config
一个从类型类和数据数组创建有效配置对象的工具
v0.3.0
2021-04-10 08:11 UTC
Requires
- php: ^7.2|^8.0
Requires (Dev)
- ext-json: *
- doctrine/annotations: ^1.11
- friends-of-phpspec/phpspec-code-coverage: ^5
- infection/infection: 0.*
- phpspec/phpspec: ^6
- phpstan/phpstan: ^0.12
- phpstan/phpstan-strict-rules: ^0.12
- slevomat/coding-standard: ^6.4
- squizlabs/php_codesniffer: ^3.5
Suggests
- doctrine/annotations: If you want to use annotations with PHP < 8
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 一样实例化它即可。
您的配置值的确定遵循以下规则
- 如果您传入一个值,它将被使用,就像使用正常的
Builder一样。 如果参数有默认值,则使用该值。
可以通过调用
$dummyBuilder->useDefaultValue(false)禁用此操作。如果参数是可空的,则使用
null。可以通过调用
$dummyBuilder->useNullable(false)禁用此操作。如果上述任何一项都不匹配,则使用与参数类型匹配的默认值。
默认值的列表(作为
type => value对)可以- 通过调用
setDefaultValues覆盖 - 通过调用
addDefaultValues添加
如果没有其他配置,则使用以下默认值
[ 'int' => 0, 'string' => '', 'float' => 0.0, 'array' => [], 'bool' => false, ]- 通过调用