Symfony2验证将无效整数更改为0

Symfony2验证将无效整数更改为0,symfony,Symfony,我在表单中添加了验证,发现在某些情况下,表单会丢失无效数据,而我会将其输入并保存0。底部的输出显示,如果我将纬度标注为'zzzzzz',这显然不是一个数字,也不是介于-90和90之间,那么表单将声明为有效,并使用值0保存 既然我已经声明输入必须是一个数字,那怎么会发生呢 ProxyType.php构建表单: $builder ->add('siteName', null, array('label' => 'Site name')) ....

我在表单中添加了验证,发现在某些情况下,表单会丢失无效数据,而我会将其输入并保存0。底部的输出显示,如果我将纬度标注为'zzzzzz',这显然不是一个数字,也不是介于-90和90之间,那么表单将声明为有效,并使用值0保存

既然我已经声明输入必须是一个数字,那怎么会发生呢

ProxyType.php构建表单:

$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().')');
        ....
validation.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) [] []

在validation.yaml中添加以下常量。然后,只有它验证了字段。 在表单类型中,您只提到您需要的小部件的类型号。这还不够。 因此,请尝试在您的应用程序中添加此验证

Validation.yml

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

希望这有帮助。

在您的validation.yaml中添加以下常量。然后,只有它验证了字段。 在表单类型中,您只提到您需要的小部件的类型号。这还不够。 因此,请尝试在您的应用程序中添加此验证

Validation.yml

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

希望这能有所帮助。

发生的事情是,您没有使用数字验证,而是将表单字段绑定为数字,因此当您将请求绑定到表单时,它会将字符串转换为一个数字,对于任何开始时没有数字的字符串,该数字都将为0。表单字段是一个数字意味着它希望以数字的形式出现,或者更确切地说,应该在这种事情的前端进行一些验证,或者前端不允许设置非数字

我认为您似乎想要的是一个带有数字验证的文本类型的表单字段

对于实际验证,请使用最小值和最大值之外的约束类型


所发生的情况是,您没有使用数字验证,而是将表单字段绑定为数字,因此,当您将请求绑定到表单时,它会将字符串转换为数字,对于任何开始时没有数字的字符串,该数字将为0。表单字段是一个数字意味着它希望以数字的形式出现,或者更确切地说,应该在这种事情的前端进行一些验证,或者前端不允许设置非数字

我认为您似乎想要的是一个带有数字验证的文本类型的表单字段

对于实际验证,请使用最小值和最大值之外的约束类型


我不能完全理解你的问题。我认为您需要验证一个只有数字的字段,对吗?是的。我在buildForm方法中将字段标记为数字,并在validators.yml中设置max/min。但是当我试图通过提交一个字符串来检查它是否工作时,它会将字段保存为0,而不是说类似此值的内容无效。我无法完全理解您的问题。我认为您需要验证一个只有数字的字段,对吗?是的。我在buildForm方法中将字段标记为数字,并在validators.yml中设置max/min。但是,当我试图通过提交字符串来检查它是否正常工作时,它会将字段保存为0,而不是说类似此值的内容无效。实际上,纬度和经度是通常希望浮动的值。实际上,纬度和经度是通常需要浮动的值。我加入了一些调试语句来查看提交给它的内容。它肯定会以“zzzz”字符串的形式到达请求。然后表单绑定到该请求并通过验证。我没有在项目的任何地方手动设置任何过滤器,也没有任何铸造。这是我有史以来第一个Symfony2项目和表单,因此我编写的代码中没有任何部分,可能是标准S2正在进行转换。我修复了我的答案,抱歉混淆,我希望可以清除它。表单类型为text,验证类型为numeric,min和max,我收到三条警告消息。提交字符串会让我明白此值应为numeric类型一次,且此值应为有效数字两次。如果我删除Max约束,它将删除一条重复的消息。很明显,任何验证一个最大值的人都必须验证它是一个数字,但没有人想要关于它的两条消息。在我之前,很多人都处理过这种行为。所以,你的问题的答案是因为表单字段类型正在转换字符串。Max和min也可以按类型进行验证。看起来,您既可以不进行类型验证,也可以更改约束的无效消息:是的,将表单字段更改为“text”而不是“number”或null会阻止值转换为数字。我不需要在验证中定义类型,因为max和min为我定义类型。我仍然会显示两条invalidMessages,因为'zzz'会触发一条来自min和max的消息。如果我更新到Symfony2.1,则会有范围验证程序来解决这个问题。我输入了一些调试语句来查看提交给它的内容。它肯定会以“zzzz”字符串的形式到达请求。然后表单绑定到该请求和pa
验证。我没有在项目的任何地方手动设置任何过滤器,也没有任何铸造。这是我有史以来第一个Symfony2项目和表单,因此我编写的代码中没有任何部分,可能是标准S2正在进行转换。我修复了我的答案,抱歉混淆,我希望可以清除它。表单类型为text,验证类型为numeric,min和max,我收到三条警告消息。提交字符串会让我明白此值应为numeric类型一次,且此值应为有效数字两次。如果我删除Max约束,它将删除一条重复的消息。很明显,任何验证一个最大值的人都必须验证它是一个数字,但没有人想要关于它的两条消息。在我之前,很多人都处理过这种行为。所以,你的问题的答案是因为表单字段类型正在转换字符串。Max和min也可以按类型进行验证。看起来,您既可以不进行类型验证,也可以更改约束的无效消息:是的,将表单字段更改为“text”而不是“number”或null会阻止值转换为数字。我不需要在验证中定义类型,因为max和min为我定义类型。我仍然会看到两条invalidMessages,因为“zzz”会触发一条来自min和max的消息。如果我更新到Symfony2.1,就会有一个范围验证器来解决这个问题。