2016-03-19 12 views
0

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

はい、ドキュメントには、選択される機能の順序が記載されています。

しかし、それは私の考えを得て、私は自分自身のためにソースコードで見に行きました。そのようなことの痕跡はありません。私は、これらの関数がcharsetを決定するために使われると言っていたと思っていると思う傾向がありますが、ソースコードにもそのようなものは存在しません。私はそれが何らかのタイプミス、コピー/ペーストエラーだと思います。彼らは右の長さを決定するためにiconv_strlenを使用して、実際には

$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; 

Here、見てみましょう。あなたの検証がうまくいくと思うのは安全だと思います。

@Columnlengthパラメータの場合、その検証は検証用ではなく、スキーマの作成/移行プロセス用です。したがって、検証プロセスのための保護手段と見なすべきではありません。

これは少し役に立ちます。

+0

あなたは私の質問のポイントを逃したと思います。 'iconv_strlen'を指定しても、文字列のバイト数は取得されませんが、データベース列ISはバイトサイズで定義されます。フォームから返された文字列の長さを検証するときにミスマッチがあり、データベースに何を追加するかが決まります。 – Twifty

関連する問題