大懒虫/argument-resolver

从关联数组解析方法参数

1.1.0 2020-04-09 09:32 UTC

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 几乎做了完全相同的事情