跳到内容

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

编辑此页

如果需要一些高级逻辑来确定验证组(例如,基于提交的数据),可以将 validation_groups 选项设置为数组回调

1
2
3
4
5
6
7
8
9
10
11
12
13
use App\Entity\Client;
use Symfony\Component\OptionsResolver\OptionsResolver;

// ...
public function configureOptions(OptionsResolver $resolver): void
{
    $resolver->setDefaults([
        'validation_groups' => [
            Client::class,
            'determineValidationGroups',
        ],
    ]);
}

这将在表单提交后但在调用验证之前,在 Client 类上调用静态方法 determineValidationGroups()。Form 对象作为参数传递给该方法(请参见下一个示例)。你还可以通过使用 Closure 来内联定义整个逻辑

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use App\Entity\Client;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

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

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

            return ['company'];
        },
    ]);
}

使用 validation_groups 选项会覆盖正在使用的默认验证组。如果你也想验证实体的默认约束,则必须按如下方式调整选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
use App\Entity\Client;
use Symfony\Component\Form\FormInterface;
use Symfony\Component\OptionsResolver\OptionsResolver;

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

            if (Client::TYPE_PERSON == $data->getType()) {
                return ['Default', 'person'];
            }

            return ['Default', 'company'];
        },
    ]);
}

你可以在关于验证组的文章中找到关于验证组和默认约束如何工作的更多信息。

这项工作,包括代码示例,根据 Creative Commons BY-SA 3.0 许可协议获得许可。
目录
    版本