Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony 5.1无数据类的表单验证_Php_Forms_Symfony_Validation_Symfony Forms - Fatal编程技术网

Php Symfony 5.1无数据类的表单验证

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

这是我第一次在我们的遗留平台上构建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, 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键,它就可以工作了