Symfony2 - 为什么隐藏字段中的整数值不被识别为整数?

时间:2012-05-27 19:47:35

标签: forms symfony hidden-field

我的Symfony2项目中有一个“评级”实体的自定义表单类型。它有一个字段,即整数。然后,我为这个实体创建了表单。以下是代码:

class RatingType extends AbstractType
{
  public function buildForm(FormBuilder $builder, array $options){
     $builder->add('value', 'hidden', array('data' => 113));
  }

  public function getDefaultOptions(array $options){
     return array(
         'data_class' => 'Acme\ArticleBundle\Entity\Rating',
     );
  }    

  public function getName() {
     return 'spesax_productbundle_pratingtype';
  }
}

当我在html页面中按提交按钮时,表单未经过验证,并且屏幕上显示“非整数”错误消息!
为什么Symfony2不会将值 113 转换为整数? 我该怎么做才能解决这个问题?

5 个答案:

答案 0 :(得分:7)

在FormType中使用类型hidden而不是integer时,symfony不知道该字段会发生什么,因此它假设一个字符串。将表单绑定到实体时,隐藏字段将作为字符串存储到实体字段中。

如果使用type="integer"进行验证,验证实体将失败,因为该值不是整数,而是可以转换为整数的字符串(保存它将起作用,因为doctrine看起来是否可以转换为给定类型)。

诀窍是在实体验证注释中使用type="numeric这将检查字段是否可以转换为整数,而不是当前值是真实整数

答案 1 :(得分:1)

感谢Sgoettschkes的回答,这对我有用。这是一个例子:

/**
* @var integer
* @Assert\NotBlank()
* @Assert\Type(type="numeric")
*
* @ORM\Column(name="value", type="integer",  nullable=false)
*/

private $value;

答案 2 :(得分:0)

另一种方法是在 set 方法中对实体的参数进行类型转换。例如:

/** @var integer $value */
private $value;

public function setValue($val){
     $this->$val = (int) $val;
     return $this;
}

答案 3 :(得分:0)

Beltouche的回答对我有用:通过将其类型转换为实体中的整数,它保存了数据库更新,否则将该字段视为不匹配的字段。

因为12345!==' 12345'即使表单/实体中没有其他内容发生变化,我也会看到我的$ id字段的不必要更新。

/** @param int $id */
private $id;

public function setId($id){
    $this->$id = (int) $id;
    return $this;
}

答案 4 :(得分:-1)

使用next:

$builder->add('fieldname', 'integer', array('attr' => array('style' => 'display: none') ) )