我有一件事我不确定如何以一种好的方式解决:我正在尝试使用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;
}
...
}
对此有何意见?
答案 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
]
]
],
]
]);
两个类都会将Callback
和call_user_func_array
的值作为参数调用callback
。
如果您需要回调函数中输入过滤器的值,那么您必须手动从options
实例中获取它们(InputFilter
)并将它们作为参数传递给函数。
如果这不能解决您的问题,请尝试更好地解释您的需求。我可以尝试提出别的东西:D