这是我第一次在我们的遗留平台上构建symfony表单(我们正在使用symfony 5.1对一个旧的整体进行越来越多的重构(。在其他只有symfony的平台上,我已经多次成功构建表单和验证,没有出现问题(3.x、4.x、5.x(。
在尝试验证值长度或有效的电子邮件地址时,我偶然发现了一种奇怪的行为。当我提交空字段时,isValid((方法返回true而不带NotBlank约束。对于服务器端验证,我禁用了客户端验证。
我确信旧代码不会干扰;但事实是,我使用的是一个php文件,控制器将我转发到该文件。
$表单->isValid((方法返回true提交此字段而不包含任何数据:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', TextType::class, [
'label' => $this->translator->trans('Your name'),
'constraints' => [
new AssertLength([
'min' => 3
])
]
]);
[snip]
}
$表单->当提交此字段为空时,isValid((方法返回false-这是所需的结果:
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder
->add('name', TextType::class, [
'label' => $this->translator->trans('Your name'),
'constraints' => [
new AssertNotBlank([
'message' => $this->translator->trans('This value should not be blank'),
]),
new AssertLength([
'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-形式类-所以它应该工作(,但我不知道这里出了什么问题。。。上面的修复是意外的:(。有人能解释为什么我需要NotBlank约束吗?或者我错过了什么。。。?
如果您进入长度验证器的代码:https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Validator/Constraints/LengthValidator.php
你可以看到:
if (null === $value || ('' === $value && $constraint->allowEmptyString)) {
return;
}
公共约束不应用于空值被认为更好。假设用户可以选择提交一个电话号码。如果它是可选的,则不能对空值触发验证失败。因此,您可以使用NotBlank约束来禁止空值。
当然,这在长度约束上没有什么意义,但我认为通过协调也可以做到这一点。如果您希望允许空值,但希望在提交值时具有最小长度,该怎么办?保持不同的约束使验证更加灵活。