如何在Symfony2中"动态"禁用一个变换器验证错误

yce*_*uto 6 php symfony symfony2-forms symfony-validator

我有一个包含许多字段和验证组的表单,这些字段也包含一些视图数据转换器.

我需要部分抑制验证表单(基于提交的数据的组):

use AppBundle\Entity\Client;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

// ...
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'validation_groups' => function (FormInterface $form) {
            $data = $form->getData();

            if (Client::TYPE_PERSON == $data->getType()) {
                return array('person');
            }

            return array('company');
        },
    ));
}
Run Code Online (Sandbox Code Playgroud)

当您这样做时,表单仍将运行基本完整性检查(禁用验证)和来自变换器的验证错误,它们将被抛出(创建变换器).

使用POST_SUBMIT事件,并防止ValidationListener被称为(抑制表单验证):

use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Form\FormEvents;
use Symfony\Component\Form\FormEvent;

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder->addEventListener(FormEvents::POST_SUBMIT, function (FormEvent $event) {
        $event->stopPropagation();
    }, 900); // Always set a higher priority than ValidationListener

    // ...
}
Run Code Online (Sandbox Code Playgroud)

它不是我的解决方案,因为不小心禁用了一些不仅仅是表单验证.

问题是:如何"动态"禁用一个变压器验证错误?

例:

我有一个形式字段RepeatedType属于person验证组和包含视图变压器(RepeatedType),该变压器抛出异常时,数组中的值它们是不相同的(ValueToDuplicatesTransformer).

因此,即使在验证组中company,表单也会显示属于RepeatedType来自变换器的字段的错误.

这里的问题是:如何ValueToDuplicatesTransformer在验证组没有时禁用错误person

Rva*_*aak 2

因为buildForm缺少与添加字段相关的代码,我假设:

  1. 您不直接将表单与实体相关联data_class,而是在控制器中设置值
  2. repeated类型有required => true一个选项,用于验证密码
  3. $data传递给表单生成器的 包含该字段的值repeated

问题基本上是触发了验证。如果有任何数据,那么该类型将始终执行基本验证(重复字段应具有相同的值两次)。

解决这个问题的方法是$data首先不要将值传递给,并确保required => false重复字段。正如您已经解释的那样,您的表单只会在那之后进行组验证。

也许最强大的解决方案甚至是不同的,最好制作两个FormTypes而不是使用groups. 这将消除您在问题中描述的大部分复杂性。