zf2zf3 注册自定义验证器,并将其注入字段集。

问题描述 投票:2回答:1

我有一个自定义的验证器。

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 被实例化,而不是通过 CustomValidatorFactorygetInputFilterSpecification() 的实例,只是创建了一个 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($)。

php zend-framework2 zend-framework3
1个回答
0
投票

我已经在这里回答了这个问题

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'));

你的麻烦就解决了

© www.soinside.com 2019 - 2024. All rights reserved.