2

我向表单添加了验证,发现在某些情况下它会丢失我输入的无效数据并保存 0。底部的输出显示,如果我将纬度发布为 ' zzzzzz',这显然不是数字,也不是介于 -90 和 90 之间,则表单被声明为有效并与 value 一起保存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 创建操作:

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

在您的 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 回答