ZF2 InputFilterManager和验证器注入

时间:2016-02-11 00:41:19

标签: php validation dependency-injection zend-framework2 zend-inputfilter

我有一件事我不确定如何以一种好的方式解决:我正在尝试使用ZF2 InputFilterManager来获取我的输入过滤器,它们使用了一些自己的验证器。

我将验证器添加到服务管理器配置中,因此可以通过InputFilterManager获取它们,并通过InputFilter定义中的关键字引用注入。只要验证器不需要任何注入或一些可从ServiceLocator获得的对象,它就可以正常工作。

但是一个验证器需要注入一个数组来进行in_array检查。 可以在验证器工厂中注入该数组,因为它依赖于在InputFilter isValid()调用发生之前运行的业务逻辑。

在不使用服务管理器的情况下,我会使用验证器的构造函数注入该数组,并在调用业务逻辑后对其进行初始化。所以问题是:如果我通过构造函数删除注入以使用InputFilterManager,我需要稍后使用:$inputFilter->get('element')->getValidatorChain()->plugin(Validator\ArrayCheck::class)->setPossibleValues($array)注入它 - 这是要走的路吗?

我非常希望通过使用构造函数将必要的依赖项注入到类中,并且在重写验证器以依赖setter注入并添加检查以验证在运行isValid()逻辑之前使用了setter时感觉有点脏

解释我关注的一些代码:

return [
    'validators' => [
        'invokables' => [
            Validator\ArrayCheck::class => Validator\ArrayCheck::class
        ]
    ],
    'input_filters' => [
        'invokables' => [
            InputFilter\Foo::class => InputFilter\Foo::class,
        ],
    ],
];

final class Process extends InputFilter
{
    public function init()
    {
        $this->add(
            [
                'name' => 'foo',
                'required' => true,
                'allow_empty' => false,
                'validators' => [
                    ['name' => Validator\ArrayCheck::class]
                ],
            ]
        );
    }
}

class ArrayCheck extends AbstractValidator
{
    /**
     * @param array $possibleValues
     * @param array|Traversable $options
     */
    public function __construct(array $possibleValues = [], $options = null)
    {
        parent::__construct($options);
        $this->possibleValues = $possibleValues;
    }

    /**
     * @param array $possibleValues
     */
    public function setPossibleValues(array $possibleValues)
    {
        $this->possibleValues = $possibleValues;
    }

    ...

}

对此有何意见?

1 个答案:

答案 0 :(得分:0)

我认为您应该查看Callback过滤器和Callback验证器类。

回调过滤器在过滤您的值时运行函数或类方法。您可以阅读Callback过滤器类here in the ZF2 documentation。您可以找到课程here on GitHUB

回调验证程序在验证您的值时运行函数或类方法。您可以阅读Callback验证程序类here in the ZF2 documentation。您可以找到课程here on GitHUB

他们都在内部使用the PHP function call_user_func_array

因此,我们假设您需要使用班级dependent business logic中的My\Filter\Dependency进行过滤,并且您的方法称为filterLogic和/或您需要使用{{{}进行验证1}}在类dependent business logic中,您的方法称为My\Validator\Dependency。你这样做:

validateLogic

$this->add([ 'name' => 'foo', 'required' => true, 'allow_empty' => false, `filters` => [ [ 'name' => \Zend\Filter\Callback::class 'callback' => [ 'My\Filter\Dependency::filterLogic' ], 'options' => [ 'argument1' => 'param1', //optional 'argument2' => 'param2' //optional ] ] ], 'validators' => [ [ 'name' => \Zend\Validator\Callback::class 'callback' => [ 'My\Validator\Dependency::validateLogic' ], 'options' => [ 'argument1' => 'param1', //optional 'argument2' => 'param2' //optional ] ] ], ] ]); 两个类都会将Callbackcall_user_func_array的值作为参数调用callback

如果您需要回调函数中输入过滤器的值,那么您必须手动从options实例中获取它们(InputFilter)并将它们作为参数传递给函数。

如果这不能解决您的问题,请尝试更好地解释您的需求。我可以尝试提出别的东西:D