我有一个自定义的验证器。
class CustomValidator extends RecordExists
{
public function isValid($value, array $context = null)
{
// some behaviour
return parent::isValid($value);
}
}
这个验证器有一个工厂
class CustomValidatorFactory implements FactoryInterface
{
public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
{
$validator = new CustomValidator();
// preparations for CustomValidator
return $validator;
}
}
CustomValidator
和它的工厂都注册在 module.config.php
在...之下
'validators' => [
'factories' => [
CustomValidator::class => CustomValidatorFactory::class,
],
],
CustomValidator
中的字段集的输入端。getInputFilterSpecification()
作为
'validators' => [
['name' => CustomValidator::class],
]
字段集是通过 init()
方法,并且在控制器工厂中调用该表单作为 $container->get('FormElementManager')->get('TheNeededForm')
.
问题是,由于某些原因。CustomValidator
被实例化,而不是通过 CustomValidatorFactory
但 getInputFilterSpecification()
的实例,只是创建了一个 new CustomValidator()
.
如何通过工厂进行自定义验证器实例化?
PS:我已经在网上浏览了一下,发现了一个类似的问题,但那里给出的解决方案并没有帮助:它建议在工厂中加入 'abstract_factories' => [FormAbstractServiceFactory::class]
在 module.config.php
,根据 'form_elements'
指令,我有一个自定义的验证器:class CustomValidator extends RecordExists { public function isValid($value, array $context = null) { /一些行为返回parent::isValid($)。
我已经在这里回答了这个问题
https:/stackoverflow.coma612872834685379。
在这里,它是。
在ZF3Laminas中,如果一个验证器被注册为可调用的,你可以调用验证器中的 getInputFilterSpecification()
的形式,就不会有问题。如果验证器是用工厂实例化的,你就会遇到麻烦。如果我的理解是正确的,即使你的表单是这样注册的。
'form_elements' => [
'factories' => [
SomeForm::class => SomeFormFactory::class,
]
]
和您的验证器。
'validators' => [
'factories' => [
SomeValidator::class => SomeValidatorFactory::class,
]
]
你不会通过工厂来实例化验证器。原因是表单工厂(你得到的那个类似于 $form->getFormFactory()
)有一个输入过滤器工厂,里面坐着默认的验证器链。而这个验证器链中没有 ValidatorManager
附。而没有 ValidatorManager
,默认链无法将验证器名称映射到验证器工厂。
为了解决这些令人头疼的问题,在你的控制器工厂里这样做。
$form->('FormElementManager')->get(SomeForm::class);
$form->getFormFactory()->getInputFilterFactory()
->getDefaultValidatorChain()->setPluginManager($container->get('ValidatorManager'));
你的麻烦就解决了