Symfony 验证规则是不是随着更新而改变?

Posted

技术标签:

【中文标题】Symfony 验证规则是不是随着更新而改变?【英文标题】:Did the Symfony validation rules change with the update?Symfony 验证规则是否随着更新而改变? 【发布时间】:2021-07-04 05:03:10 【问题描述】:

从 Symfony 2.x 更新到 Symfony 4.x 并检查运行后,电子邮件地址的验证规则发生了变化。 在 Symfony 2.x 中,像 "あ@test.co.jp" 这样的非字母数字词被 Symfony 验证排斥,但在 Symfony 4.x 中没有。规则是否随着更新而改变? 另外,有没有办法撤销规则? 使用我自己的验证规则,我担心我以前使用的电子邮件地址可能会在验证中被捕获。 此外,如果您删除“@”,您将收到验证错误消息“不是有效的电子邮件地址”,因此认为验证本身正在工作。

Symfony 2.x 和 Symfony 4.x 通用的验证规范代码

        Mail:
            - NotBlank: ~
            - Email: ~

【问题讨论】:

あ@test.co.jp 是a valid email address。 @yivi 我明白了,国际规则已经改变了。 【参考方案1】:

基本上 2.1 只是验证您的邮件,没有选择如何验证。

2.5 引入strict 模式 - here is the commit。

如您所见,在此更改之前,Symfony 将使用filter_var()FILTER_VALIDATE_EMAIL。更改后,它使用EmailValidator 进行严格模式。

4.1 然后replaced that 使用mode 选项以获得更多粒度。

电子邮件地址的验证是开发人员之间永无止境的争论之一。有些人认为您无法真正以编程方式验证它们,并且您必须始终发送确认电子邮件。其他人则认为,符合 RFC 5322 的编程验证对于实际应用程序来说已经足够了。

Symfony 总是通过电子邮件验证约束的严格选项做出这个选择。如果为 false,则根据简单的正则表达式验证电子邮件地址。如果为 true,则使用 egulias/email-validator 第三方库完成符合 RFC 的验证。

但是,用于验证电子邮件地址的正则表达式过于简单。这就是为什么在 Symfony 4.1 中我们决定开始使用与 html5 相同的电子邮件验证。在实践中,我们弃用了 strict 选项,转而使用新的模式选项

我会假设严格模式和使用filter_var 的pre 2.5 方法之间存在一些差异。

如果您需要保留确切的功能,我认为您需要添加一个使用 filter_var 的 custom constraint - 像这样:

# src/Validator/FilterVarEmail.php
namespace App\Validator;

use Symfony\Component\Validator\Constraint;

/**
 * @Annotation
 */
class FilterVarEmail extends Constraint

    public $message = 'Email invalid.';


# src/Validator/FilterVarEmailValidator.php
namespace App\Validator;

use Symfony\Component\Validator\Constraint;
use Symfony\Component\Validator\ConstraintValidator;

class FilterVarEmailValidator extends ConstraintValidator

    public function validate($value, Constraint $constraint)
    
        /* @var $constraint \App\Validator\FilterVarEmail */

        if (null === $value || '' === $value) 
            return;
        

        if (false === filter_var($value, FILTER_VALIDATE_EMAIL)) 
            $this->context
                ->buildViolation($constraint->message)
                ->addViolation()
            ;
        
    

编辑:也就是说,值得注意的是,电子邮件地址和域名中允许使用特殊字符,因此为了让您的系统能够适应未来,您可能需要对其进行更改以支持这一点。

【讨论】:

感谢您的回答。毕竟发生了变化。是否承认 strict 应该设置为 true 以使其类似于 2.3? @scottie320 不,不幸的是,这不一样。我更新了我的答案,为您提供了更多信息。 谢谢。我很好理解。自定义验证也有效,这正是我想要的。

以上是关于Symfony 验证规则是不是随着更新而改变?的主要内容,如果未能解决你的问题,请参考以下文章

Symfony 5.3 新身份验证不保留我的身份验证

Symfony 安全返回 401 响应而不是重定向

“不存在”是不是有验证规则?

在 Symfony2 中使用自定义身份验证提供程序

Symfony 验证仅在新表单上

Symfony 2.1.7 - 用户通过身份验证后更新安全令牌设置特定角色