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を使用したり、カスタム制約を作成したりすることもできます。しかし、良い方法がありますか?フォームフィールドから受け取った文字列は、データベースに永続化される前にどのように検証されますか?
あなたは私の質問のポイントを逃したと思います。 'iconv_strlen'を指定しても、文字列のバイト数は取得されませんが、データベース列ISはバイトサイズで定義されます。フォームから返された文字列の長さを検証するときにミスマッチがあり、データベースに何を追加するかが決まります。 – Twifty