Symfony形式验证整数字段

时间:2015-04-21 17:54:36

标签: forms validation symfony

我正在尝试将类型验证规则与整数一起使用,但它失败了并发出了一些警告。

这是我的表格

class BusinessType extends AbstractType {

    public function buildForm(FormBuilderInterface $builder, array $options) {
        $builder->add('business_number', 'integer', array(
            'required' => false,
        ));
    }

}

这是我的验证规则

My\Bundle\Entity\Business:
    properties:
        business_number:
            - Type:
                type: integer

所以没什么奢侈的!

但是我收到以下错误

  

未捕获的PHP异常Symfony \ Component \ Debug \ Exception \ ContextErrorException:"警告:NumberFormatter :: parse():数字解析失败"

我已经找到了here的作品,但是这样做并不合适。如果没有其他解决办法我会,但我宁愿避免它。

我知道这是早期版本的Symfony中的已知错误,但它应该是修复。请参阅here

那么有没有办法可以使用类型验证?如果是这样,我错过了什么?

编辑1

我正在使用Symfony 2.6.6

编辑2

如果我的值以数字开头(例如 123dd ),即使我自定义了错误消息,也会出现以下错误消息

  

此值无效。

但如果我的价值从别的东西开始,我就会有前面提到的错误。

编辑3

我需要存储的最长值是9位数。所以整数应该正常工作。

编辑4

以下是bug report

1 个答案:

答案 0 :(得分:2)

问题是integer和/或number Symfony表单类型在将值存储到表单之前使用Symfony\Component\Intl\NumberFormatter\NumberFormatter::parse method。该方法的内容如此(如Symfony 2.6.6):

public function parse($value, $type = self::TYPE_DOUBLE, &$position = 0)
{
    if ($type == self::TYPE_DEFAULT || $type == self::TYPE_CURRENCY) {
        trigger_error(__METHOD__.'(): Unsupported format type '.$type, \E_USER_WARNING);
        return false;
    }
    preg_match('/^([^0-9\-\.]{0,})(.*)/', $value, $matches);
    // Any string before the numeric value causes error in the parsing
    if (isset($matches[1]) && !empty($matches[1])) {
        IntlGlobals::setError(IntlGlobals::U_PARSE_ERROR, 'Number parsing failed');
        $this->errorCode = IntlGlobals::getErrorCode();
        $this->errorMessage = IntlGlobals::getErrorMessage();
        $position = 0;
        return false;
    }
    preg_match('/^[0-9\-\.\,]*/', $value, $matches);
    $value = preg_replace('/[^0-9\.\-]/', '', $matches[0]);
    $value = $this->convertValueDataType($value, $type);
    $position = strlen($matches[0]);
    // behave like the intl extension
    $this->resetError();
    return $value;
}

值得注意的是这一部分:

preg_match('/^([^0-9\-\.]{0,})(.*)/', $value, $matches);
// Any string before the numeric value causes error in the parsing
if (isset($matches[1]) && !empty($matches[1])) {
    IntlGlobals::setError(IntlGlobals::U_PARSE_ERROR, 'Number parsing failed');

// ...

会导致任何格式错误的条目在开头都有一个字符串抛出异常。

不幸的是,更改验证规则将无效,因为在验证发生之前运行解析。

您唯一的解决方法将是您已链接的解决方案,并提交错误报告,直到问题得到解决。 current master branch doesn't have an update to this file并且不清楚问题是否在其他地方得到解决(需要进一步的研究)。

前端验证也可以提供帮助(例如,HTML5 numberinteger类型的内置验证会导致大多数浏览器在提交给Symfony之前阻止您。