【问题标题】:Symfony2 - why the integer value in the hidden field is not recognized as integer?Symfony2 - 为什么隐藏字段中的整数值不被识别为整数?
【发布时间】:2012-05-27 19:47:35
【问题描述】:

我的 Symfony2 项目中有一个“Rating”实体的自定义表单类型。它有一个value字段,即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 页面中按下 提交 按钮时,表单未通过验证,并且屏幕上显示“not an integer”错误消息!
为什么 Symfony2 不将值 113 转换为整数? 我该怎么做才能解决这个问题?

【问题讨论】:

  • 是否使用整数字段类型进行验证? ($builder->add('value', 'integer'...)
  • 我是这么想的,但我不得不问。我试图找到一种方法将字段类型设置为hiddeninteger,但没有成功。你如何验证表格?你试过Type constraint吗?
  • 不,我只在实体 PHP 类中使用断言......但是,我认为实体 Rating 内部的问题,因为字段 value 被映射为 integer .因此,Symfony2 会自动验证渲染表单的隐藏字段提供的值,并无缘无故地声明它不是整数!
  • 我猜你使用 type="integer" 检查类型?尝试改用“数字”。由于 symfony 无法判断隐藏字段应该是整数还是字符串,因此它不进行类型转换。整数失败,因为“113”不是 PHP 中的整数。另一方面,numberic 检查是否可以将字符串转换为正确的整数,这种情况是正确的,因此应该正确验证。
  • @Sgoettschkes 太好了!你说的对!发布答案,我会投票并接受!丹克

标签: forms symfony hidden-field


【解决方案1】:

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

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

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

【讨论】:

  • 这也适用于表单域定义为类型integer,但有选项disabled=true ...
  • numeric 是否允许使用小数位?如何在一个注释中指定它应该允许小数位(因为它实际上是 float),但在另一个注释中它不应该(因为它实际上是 integer)?
【解决方案2】:

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

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

private $value;

【讨论】:

    【解决方案3】:

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

    /** @var integer $value */
    private $value;
    
    public function setValue($val){
         $this->$val = (int) $val;
         return $this;
    }
    

    【讨论】:

      【解决方案4】:

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

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

      /** @param int $id */
      private $id;
      
      public function setId($id){
          $this->$id = (int) $id;
          return $this;
      }
      

      【讨论】:

        【解决方案5】:

        使用下一个:

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

        【讨论】:

        • 虽然这是一个巧妙的技巧,但它违反了关注点分离:您不应该从 PHP 代码中控制视图状态。
        猜你喜欢
        • 2013-08-18
        • 2015-11-12
        • 1970-01-01
        • 2021-09-27
        • 2014-12-06
        • 1970-01-01
        • 2016-10-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多