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

Symfony 5.1 form validation without data class

这是我第一次在我们的遗留平台上构建一个 symfony 表单(我们正在使用 Symfony 5.1 重构越来越多的旧单体)。在其他仅限 Symfony 的平台上,我已经成功地构建了好几次表单和验证,没有出现任何问题(3.x、4.x、5.x)。

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

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

$form->isValid() 方法returns 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() 方法 returns 在提交此字段为空时为 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 约束对我来说似乎是错误的 - 我已经在此处检查了最小长度。与其他文本字段相同,当将字段留空时,电子邮件约束 returns 为真。我一遍又一遍地阅读文档(参见 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;
}

公共约束不适用于空值被认为更好。 假设用户可以选择提交 phone 号码。如果它是可选的,则不能对空值触发验证失败。因此,您可以自由地使用 NotBlank 约束来禁止空值。

当然,它对长度约束的意义不大,但我认为它是通过协调以相同的方式完成的。如果你想允许空值,但希望如果提交了一个值,它有一个最小长度怎么办?保持约束不同使验证更加灵活。