我正在尝试将类型验证规则与整数一起使用,但它失败了并发出了一些警告。
这是我的表格
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。
那么有没有办法可以使用类型验证?如果是这样,我错过了什么?
我正在使用Symfony 2.6.6
如果我的值以数字开头(例如 123dd ),即使我自定义了错误消息,也会出现以下错误消息
此值无效。
但如果我的价值从别的东西开始,我就会有前面提到的错误。
我需要存储的最长值是9位数。所以整数应该正常工作。
以下是bug report
答案 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 number
和integer
类型的内置验证会导致大多数浏览器在提交给Symfony之前阻止您。