【问题标题】:Validating string size in forms验证表单中的字符串大小
【发布时间】:2016-03-19 10:46:43
【问题描述】:

在设置要与 Symfony 表单一起使用的学说实体时,我想验证给定的字符串大小不会超过数据库的列大小。请注意,我使用的是字长而不是长度。

Symfony 附带了许多验证约束,尤其是Length Constraint。但是,查看它的文档

计算值长度时使用的字符集。这 如果可用,则使用 grapheme_strlen PHP 函数。如果没有,则 如果可用,则使用 mb_strlen PHP 函数。如果两者都不可用, 使用了strlen PHP函数。

它使用grapheme_strlenmb_strlen 返回字符串的视觉长度而不是实际大小。在处理非 ASCII 字符串时,实际大小是一个因素。例如,大多数亚洲语言为每个字符使用 3 个字节。

doctrine documentation 没有说明 @Column(length) 注释,这让我相信这是一个字节数。所以,如果我声明一个长度为 64 的列和一个最大大小为 64 的约束,就会出现问题。

现在,我可以使用Callback Constraint 甚至创建自定义约束。但是,有没有更好的方法?从表单字段接收到的字符串在被持久化到数据库之前应该如何验证其大小?

【问题讨论】:

    标签: php validation symfony doctrine-orm


    【解决方案1】:

    是的,文档确实提到了将在两者之间选择的功能顺序。

    但是,这让我开始思考,我亲自去源代码中查看它。没有这种东西的踪迹。我倾向于相信他们想说这些函数将用于确定字符集,但是,源代码中也不存在这样的东西。我认为这是某种拼写错误,复制/粘贴错误。

    Here,看看:

    $stringValue = (string) $value;
    if ('UTF8' === $charset = strtoupper($constraint->charset)) {
        $charset = 'UTF-8'; // iconv on Windows requires "UTF-8" instead of "UTF8"
    }
    
    $length = @iconv_strlen($stringValue, $charset);
    $invalidCharset = false === $length;
    

    事实上,他们使用iconv_strlen 来确定正确的长度。我认为可以安全地假设您的验证会做得很好。

    至于@Column length 参数,该参数不是用于验证,而是用于模式创建/迁移过程。因此,不应将其视为验证过程的保障。

    希望这会有所帮助。

    【讨论】:

    • 我认为您错过了我的问题的重点。即使使用iconv_strlen,我也没有得到字符串的字节数,但数据库列是由字节大小定义的。验证从表单返回的字符串长度以及要添加到数据库的内容时,出现未匹配。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-13
    • 2012-12-21
    • 1970-01-01
    • 1970-01-01
    • 2016-10-10
    • 1970-01-01
    • 2011-08-14
    相关资源
    最近更新 更多