4

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

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转换为整数?我能做些什么来解决这个问题?

4

5 回答 5

8

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

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

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

于 2012-05-30T19:35:37.033 回答
2

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

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

private $value;
于 2013-10-09T10:22:30.663 回答
0

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

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

public function setValue($val){
     $this->$val = (int) $val;
     return $this;
}
于 2018-01-06T01:26:39.727 回答
0

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

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

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

public function setId($id){
    $this->$id = (int) $id;
    return $this;
}
于 2018-01-07T13:52:36.247 回答
-1

接下来使用:

$builder->add('fieldname', 'integer', array('attr' => array('style' => 'display: none') ) )
于 2013-11-21T12:02:56.710 回答