验证表单中的字符串大小

时间:2016-03-19 10:46:44

标签: php validation symfony doctrine-orm

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

Symfony附带了许多验证限制,特别是Length Constraint。但是,查看它的文档

  

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

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

doctrine documentation没有说明@Column(length)注释,这让我相信它是一个字节数。因此,如果我声明一个长度为64的列和一个约为max-size 64的列,则会出现问题。

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

1 个答案:

答案 0 :(得分:0)

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

但是,这让我思考,我在源代码中亲自看到它。没有这种事情的痕迹。我倾向于认为他们想说这些函数将用于确定字符集,但是,源代码中也没有这样的东西。我认为这是一种拼写错误,复制/粘贴错误。

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参数,该参数不用于验证,而是用于架构创建/迁移过程。因此,它不应被视为验证过程的保障。

希望这有点帮助。