我在表单中添加了验证,发现在某些情况下,它正在丢失我正在提供的无效数据并保存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().')');
....
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) [] []
答案 0 :(得分:5)
发生的事情是你没有使用数字验证,而是将表单字段绑定为数字,因此当您将请求绑定到表单时,它会将字符串转换为数字(对于任何以一个数字将是0)。表单字段是一个数字意味着它希望作为一个数字,或者更确切地说,应该在这样的事情的前端进行一些验证,或者前端不应该允许设置非数字。
我认为你想要的是带有数字验证的文本类型的表单字段。
对于实际验证,请使用约束类型(除最小值和最大值之外)。
http://symfony.com/doc/current/book/validation.html
http://symfony.com/doc/current/reference/constraints/Type.html
答案 1 :(得分:-1)
在validation.yaml中添加以下constarins。然后只有它验证了字段。 在您的表单类型中,您只提到您需要的小部件类型(数量)。这还不够。 所以尝试在
中添加此验证Validation.yml
latitude
- Type:
type: integer
message: latitude should be numeric
longitude
- Type:
type: integer
message: longitude should be numeric
希望这有帮助。