如何根据提交的数据选择验证组

3.4 版本
维护中的版本

如果在验证组你需要一些高级的逻辑(例如根据提交的数据),你可以设置validation_groups为数组:

1
2
3
4
5
6
7
8
9
10
11
12
use Symfony\Component\OptionsResolver\OptionsResolver;
 
// ...
public function configureOptions(OptionsResolver $resolver)
{
    $resolver->setDefaults(array(
        'validation_groups' => array(
            'AppBundle\Entity\Client',
            'determineValidationGroups',
        ),
    ));
}

这将在表单提交后,执行验证之前,调用Client类的静态方法determineValidationGroups()。表单对象作为一个参数传入到该方法(下面例子)。你也可以通过一个Closure来定义整个逻辑:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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');
        },
    ));
}

使用validation_groups配置去覆盖正在使用的默认验证组。如果你想要去验证实体的默认约束就必须调整选项如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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('Default', 'person');
            }
 
            return array('Default', 'company');
        },
    ));
}

验证组章节中你可以找到更多验证组和默认约束的细节。

本文,包括例程代码在内,采用的是 Creative Commons BY-SA 3.0 创作共用授权。

登录symfonychina 发表评论或留下问题(我们会尽量回复)