我的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 转换为整数?
我该怎么做才能解决这个问题?
答案 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') ) )