在设置要与Symfony表单一起使用的doctrine实体时,我想验证给定的字符串大小是否不会超过数据库的列大小。请注意,我使用的是字大小而不是长度。
Symfony附带了许多验证限制,特别是Length Constraint。但是,查看它的文档
计算值的长度时使用的字符集。该 grapheme_strlen如果可用,则使用PHP函数。如果没有,那就是 mb_strlen如果可用,则使用PHP函数。如果两者都不可用, 使用了strlen PHP函数。
它使用grapheme_strlen
或mb_strlen
来返回字符串的可视长度而不是实际大小。处理非ASCII字符串时,实际大小是一个因素。例如,大多数亚洲语言为每个字符使用3个字节。
doctrine documentation没有说明@Column(length)
注释,这让我相信它是一个字节数。因此,如果我声明一个长度为64的列和一个约为max-size 64的列,则会出现问题。
现在,我可以使用Callback Constraint甚至创建自定义约束。但是,有更好的方法吗?从表单字段收到的字符串如何在保存到数据库之前验证其大小?
答案 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
参数,该参数不用于验证,而是用于架构创建/迁移过程。因此,它不应被视为验证过程的保障。
希望这有点帮助。