2017-09-01 7 views
1

を引き起こさない:symfonyの - 整数タイプフィールドの10進数は、これは、エンティティのフィールドでない検証エラー

/** 
* @Assert\NotBlank(groups={"group1"}) 
* @Assert\Type(type="integer", groups={"group1"}) 
* @Assert\Range(min=0, groups={"group1"}) 
* @ORM\Column(type="integer") 
*/ 
private $cableCount; 

、これはフォームタイプに対応するフィールドである。

$builder->add('cableCount', IntegerType::class, [ 
    'label' => 'Cable Count', 
    'required' => true 
]); 

フィールドであります上矢印と下矢印でレンダリングし、ユーザーは1、2、3、...のような値を増減できます。 しかし、ユーザーは3.45を入力してフォームを送信することもできます。検証エラーは表示されません。値は3に丸められます。予想される動作は、このフィールドが整数だけを受け入れることができることをユーザーに通知する検証エラーを取得することです。

この問題をどのように解決すればよいですか? これにsymfonyの組み込み機能がありますか?それともカスタム制約を作成すべきですか?

/** @Assert\Regex(pattern="/^\d*$/") */ 

編集:@JasonRomanによってmentionnedとして、あなたが最初に自動的に入力を丸めますIntegerTypeに対処する必要があなたは正規表現を使用しようとすることができ

+0

は小枝がフォームをオーバーライドして、私の答えを更新しました。 –

答えて

2

symfonyのIntegerTypeautomatically roundあなたがそれに送信する番号。ブラウザ側では、IntegerTypeを使用すると、通常、フォームを送信する前に有効な整数がチェックされます。

NumberTypeを使用する必要があります。 @Assert\Type(type="integer", groups={"group1"})はサーバー上で実行され、非整数を送信すると適切なエラーが発生します。

唯一の問題は、上矢印または下矢印を失うことです。その場合は、NumberTypeのカスタムフォームテーマでオーバーライドする必要があります。このような何か:

フォームタイプでその後
{%- block number_widget -%} 
    {%- set type = form.vars.attr['int'] is defined and form.vars.attr['int'] 
     ? 'number' 
     : type|default('text') 
    -%} 
    {{ block('form_widget_simple') }} 
{%- endblock number_widget -%} 

、そのようなattrことを指定します。

$builder->add('cableCount', NumberType::class, [ 
    'label' => 'Cable Count', 
    'required' => true, 
    'attr' => [ 
     'int' => true, 
    ] 
]); 
+0

詳細なお返事ありがとうございます。その問題を解決しました。 FormTypeでIntegerTypeをNumberTypeに変更するのを忘れたと思います。 – MehdiB

+1

あなたは私の答えを適切に更新しました。 –

0

は次のように主張します。

+1

'IntegerType'クラスの使用時に問題が解決しない –

+1

これで問題は解決しませんでした。 – MehdiB

+1

はい、私は[ドキュメント](http://symfony.com/doc/current/reference/forms/types/integer.html)であなたの入力が常に丸められることを見ました。おそらく、 'scale'と' rounding_mode'フィールドのオプションを使って小数点以下を許してから、バリデーターがエラーを投げるようにすることができます。 –

関連する問題