大懒虫 / argument-resolver
从关联数组解析方法参数
1.1.0
2020-04-09 09:32 UTC
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.16
- phpstan/phpstan: ^0.10.1
- phpunit/phpunit: ^7.2
This package is auto-updated.
Last update: 2024-09-09 18:01:37 UTC
README
解析并验证关联数组中的方法参数。
- 从关联数组解析包括默认值的参数。
- 如果缺少必需的参数,则抛出异常。
- 如果提供了额外的参数,则抛出异常。
示例
class Foobar
{
public function execute(string $foobar, $barfoo = 'foobar')
{
}
}
$argumentResolver = new ArgumentResolver();
$arguments = $argumentResolver->resolveArguments(Foobar::class, 'execute', [
'foobar' => 'hello'
]);
var_dump($arguments);
// array(2) {
// [0] =>
// string(5) "hello"
// [1] =>
// string(6) "foobar"
// }
$result = call_user_func([$myClass, 'myMethod'], $arguments);
动机
通常希望服务有一些运行时调用配置,这些配置由用户提供(类似于Symfony Forms和Symfony OptionResolver 组件,它执行类似的操作
$resolver = new OptionsResolver();
$resolver->setDefault([
'barfoo' => 'hello',
]);
$resolver->setRequired('foobar')l
$options = $resolver->resolve(['foobar' => 'hello']);
$myService->doSomething($options);
我在PHPBench中使用过这种模式,发现它在运行时配置服务调用非常有用。然而,它也有一些缺点
- 您的服务会接收到一个未类型化的数组。
- 服务对选项解析器有隐式依赖。
此包的功能类似于选项解析器,但它使用方法的反射信息来解析参数。
缺点
这种方法意味着您不能为您的服务实现接口(例如 execute($blah, array $config)
,因为每个服务将有自己的签名 execute($blah, $timeout = 1234, $iterations = 33)
)。
类似库
https://github.com/sroze/ArgumentResolver 几乎做了完全相同的事情