2

フォームにバリデーションを追加したところ、場合によっては無効なデータが失われ、代わりに 0 が保存されていることがわかりました。下部の出力は、緯度を ' zzzzzz' として投稿すると、明らかに数値でも -90 ~ 90 でもない場合、フォームが有効であると宣言され、値 で保存されることを示しています0

入力が数値でなければならないことを宣言した場合、どのようにそれが起こりますか?

ProxyType.php buildForm():

$builder
        ->add('siteName', null, array('label' => 'Site name'))
        ....
        ->add('latitude', 'number', array('label' => 'Latitude'))
        ->add('longitude', 'number', array('label' => 'Longitude'))
        ....
    ;

ProxyController.php createAction:

    ....
    $postData = $request->request->get('niwa_pictbundle_proxytype');
    $this->get('logger')->info('Posted latitude = '.$postData['latitude']);

    $form    = $this->createForm(new ProxyType(), $entity);
    $form->bindRequest($request);

    if ($form->isValid()) {
        $this->get('logger')->info('Form declared valid : latlong ('.$entity->getLatitude().','.$entity->getLongitude().')');
        ....

検証.yml:

Acme\PictBundle\Entity\Proxy:
properties: 
    longitude:
        - Min: { limit: -180 }
        - Max: { limit: 180 }
    latitude:
        - Max: { limit: 90 }
        - Min: { limit: -90 }

出力:

[2012-09-28 02:05:30] app.INFO: Posted latitude = zzzzzz [] []
[2012-09-28 02:05:30] app.INFO: Form declared valid : latlong (0,0) [] []
4

2 に答える 2

5

何が起こっているのかというと、数値検証を使用しているのではなく、フォームフィールドを数値に制限しているため、リクエストをフォームにバインドすると、文字列が数値に変換されます (数値なしで始まる文字列の場合、 0 である)。フォームフィールドが数値であるということは、それが数値として来ることを期待していることを意味します。むしろ、そのようなもののフロントエンドで何らかの検証が必要であるか、フロントエンドで非数値の設定を許可してはなりません。

あなたが望んでいるように見えるのは、数値検証を備えたテキスト型のフォームフィールドだと思います。

実際の検証では、制約タイプを使用します (最小値と最大値に加えて)。

http://symfony.com/doc/current/book/validation.html

http://symfony.com/doc/current/reference/constraints/Type.html

于 2012-09-28T11:58:24.527 に答える
-1

次の constarins を validation.yaml に追加します。次に、フィールドのみを検証しました。フォーム タイプでは、必要なウィジェットのタイプ (数) のみを言及します。それでは十分じゃない。この検証をあなたの

検証.yml

latitude
    - Type:
        type: integer
        message: latitude should be numeric
longitude
    - Type:
        type: integer
        message: longitude should be numeric

お役に立てれば。

于 2012-09-28T09:28:23.083 に答える