sroze/argument-resolver

一个轻量级的工具,根据类型和名称解析方法参数

2.0.4 2017-12-16 21:02 UTC

This package is auto-updated.

Last update: 2024-08-29 03:36:43 UTC


README

Build Status SensioLabsInsight Scrutinizer Code Quality

这个轻量级库可以帮助开发者自动调用可调用对象(函数、方法或闭包)并传递一组可用的参数。开发者可以使用类型提示和/或特定的变量名称来选择他们想要的参数。

安装

建议的安装方法是使用composer

composer require sroze/argument-resolver

解析参数

可以通过使用ArgumentResolverFactory类轻松地创建参数解析器

use ArgumentResolver\ArgumentResolverFactory;

$argumentResolver = ArgumentResolverFactory::create();

resolveArguments方法返回给定可调用对象解析后的参数的有序数组。该方法参数包括:

  1. 可调用对象
  2. 可用的参数,作为数组

以下是如何使用一组可用的参数来解析某些闭包参数的示例

$closures = [
    function(MyClass $object) {
        return $object instanceof MyClass;
    },
    function($bar, array $list) {
        return count($list);
    }
];

foreach ($closures as $callable) {
    $arguments = $argumentResolver->resolveArguments($callable, [
        'classObject' => new MyClass(),
        'bar' => 'foo',
        'list' => ['an', 'array']
    ]);
    
    // ...
}

除了类型提示的参数识别,还可以使用名称

class Foo
{
    public function method($foo, $bar)
    {
    }
}

$argumentResolver->resolveArguments([new Foo(), 'method'], [
    'bar' => 1,
    'foo' => 2,
    'baz' => 3
]);

// Which returns: [2, 1]

为了防止可能的冲突,该库遵循规则章节中描述的优先级和约束。

可调用执行器

因为当你解析了给定可调用对象所需的参数时,通常是为了调用它,因此该库附带了一个CallableRunner类,它会为你做所有事情。

$runner = new CallableRunner($argumentResolver);
$runner->run($callable, $availableArguments);

实例化对象

有时,你可能希望用一组参数来实例化一个对象。以下是Instanciator的使用方法。

$instantiator = new Instantiator($argumentResolver);
$instantiator->instantiate(YourClassName::class, $availableArguments);

规则

优先级

以下是对参数解析的优先级

  1. 严格匹配:相同的名称和类型
  2. 类型匹配
  3. 名称匹配

约束

以下约束适用:

  • 如果有多个相同类型的参数,则对此类型应用严格匹配
  • 必需的参数必须解析