4

我有一些复杂的表单,有几个子表单,我希望能够根据在主表单中选择的单选按钮分别验证每个子表单。我想通过验证组来实现这一点。

注意:我没有data_class模型,我使用数组。

这是我的简化表格:

class MyType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('xxx', 'text', array(
                'constraints' => array(
                    new Constraints\NotBlank(),
                ),
                'validation_groups' => array(
                    'xxx',
                )
            ))
        ;
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'validation_groups' => function(FormInterface $form) {
                return array('xxx');
            },
        ));
    }
}

问题是没有触发对该字段的验证。

setDefaultOptions当这工作时,我可以根据提交的数据轻松更改以验证所需的组:

public function setDefaultOptions(OptionsResolverInterface $resolver)
{
    $resolver->setDefaults(array(
        'validation_groups' => function(FormInterface $form) {
            $data = $form->getData();

            return array($data['type']);
        },
    ));
}

任何想法?

4

1 回答 1

12

您必须将验证组名称传递给约束,而不是表单本身。通过将组名分配给表单,您可以指定在验证中使用哪些约束。

代替

$builder->add('xxx', 'text', array(
        'constraints' => array(
            new Constraints\NotBlank(),
        ),
        'validation_groups' => array(
            'xxx',
        )
    ))
;

$builder->add('xxx', 'text', array(
        'constraints' => array(
            new Constraints\NotBlank(array(
                'groups' => 'xxx'
            )),
        ),
    ))
;

默认情况下,约束具有“默认”(大写)组,并且表单使用该组来验证是否未指定。如果您希望其他没有明确组的约束与指定的组一起验证,则传递“默认”一个。

$resolver->setDefaults(array(
    'validation_groups' => function(FormInterface $form) {
        $data = $form->getData();

        return array($data['type'], 'Default');
    },
));
于 2012-11-02T17:28:49.073 回答