Php Symfony 5.1无数据类的表单验证
这是我第一次在我们的遗留平台上构建symfony表单(我们正在使用symfony 5.1越来越多地重构一个旧的整体)。在其他仅限Symfony的平台上,我已经多次成功构建表单和验证,没有出现任何问题(3.x、4.x、5.x) 在尝试验证值长度或有效电子邮件地址时,我偶然发现了一种奇怪的行为。当我提交空字段时,isValid()方法返回true,不带NotBlank约束。对于服务器端验证,我已禁用客户端验证 我很确定旧代码不会干扰;但事实是,我使用的是一个php文件,由控制器转发到该文件 $form->isValid()方法返回true提交此字段时不包含任何数据:Php Symfony 5.1无数据类的表单验证,php,forms,symfony,validation,symfony-forms,Php,Forms,Symfony,Validation,Symfony Forms,这是我第一次在我们的遗留平台上构建symfony表单(我们正在使用symfony 5.1越来越多地重构一个旧的整体)。在其他仅限Symfony的平台上,我已经多次成功构建表单和验证,没有出现任何问题(3.x、4.x、5.x) 在尝试验证值长度或有效电子邮件地址时,我偶然发现了一种奇怪的行为。当我提交空字段时,isValid()方法返回true,不带NotBlank约束。对于服务器端验证,我已禁用客户端验证 我很确定旧代码不会干扰;但事实是,我使用的是一个php文件,由控制器转发到该文件 $for
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, array $options)
{
$builder
->add('name', TextType::class, [
'label' => $this->translator->trans('Your name'),
'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。我已经一次又一次地阅读了文档(请参阅-因此它应该可以工作),但我不知道这里出了什么问题。。。上面的修复是意外的:)。有人能解释为什么我需要NotBlank约束吗?或者我遗漏了什么…?如果您输入长度验证器的代码: 你可以看到:
if (null === $value || ('' === $value && $constraint->allowEmptyString)) {
return;
}
最好不要将常见约束应用于空值。
假设用户可以选择提交一个电话号码。如果是可选的,则不能对空值触发验证失败。因此,您可以使用NotBlank约束自由禁止空值
当然,在长度限制上,这没有什么意义,但我认为通过协调,它也是以同样的方式实现的。如果您希望允许空值,但希望在提交值时具有最小长度,该怎么办?保持契约的独特性使验证更加灵活。这是出于设计,您可以在“谢谢”下方的注释中看到。我忽略了那个框--另外,你可以删除
$this->translator->trans
,只需留下translation键,它就可以工作了