没有数据类的Symfony 5.1表单验证

问题描述

这是我第一次在旧版平台上构建symfony表单(我们越来越多地使用Symfony 5.1重构旧的巨石)。在其他仅限Symfony的平台上,我已经多次管理过构建表单和验证而没有问题(3.x,4.x,5.x)。

当我尝试验证值长度或有效的电子邮件地址时,我偶然发现了一个奇怪的行为。当我提交空白字段时,isValid()方法将返回 true 而没有NotBlank约束。对于服务器端验证,我已禁用了客户端验证。

我很确定旧代码不会干扰;但事实是,我使用的是由控制器转发到的php文件。

$ form-> isValid()方法在没有任何数据的情况下提交此字段将返回true:

public function buildForm(FormBuilderInterface $builder,array $options)
{
    $builder
        ->add('name',TextType::class,[
            'label' => $this->translator->trans('Your name'),'constraints' => [
                new Assert\Length([
                    'min' => 3
                ])
            ]
        ]);
    [snip]    
}

将此字段提交为空时,$ form-> isValid()方法将返回false-这是所需的结果:

public function buildForm(FormBuilderInterface $builder,'constraints' => [
                new Assert\NotBlank([
                    'message' => $this->translator->trans('This value should not be blank'),]),new Assert\Length([
                    'min' => 3,'minMessage' => $this->translator->trans('This value must be at least {{ limit }} characters long')
                ])
            ]
        ]);
    [snip]
}

添加NotBlank约束对我来说似乎是错误的-我已经在这里检查了最小长度。与其他文本字段相同,将字段保留为空时,电子邮件约束也返回true。我已经一遍又一遍地阅读了文档(请参阅https://symfony.com/doc/current/validation.html#constraints-in-form-classes-因此它应该可以工作),但是我不知道这里出了什么问题...上面的修复是偶然的:)。有人能够解释为什么我需要NotBlank约束吗?还是我想念某事...?

解决方法

如果您输入了长度验证器的代码:https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Validator/Constraints/LengthValidator.php

您可以看到:

if (null === $value || ('' === $value && $constraint->allowEmptyString)) {
    return;
}

最好考虑将公共约束不适用于空值。 假设用户可以选择提交电话号码。如果是可选的,则不能在空值上触发验证失败。因此,您可以随意使用NotBlank约束禁止使用空值。

这当然对长度约束没有多大意义,但我认为通过统一的方式也可以做到这一点。如果您想允许空值,但又希望提交一个值的长度最小,该怎么办?相互矛盾可以使验证更加灵活。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...