Symfony - 整数类型字段中的十进制数字不会导致验证错误
Symfony - decimal number in integer type field causes no validation error
这是实体中的字段:
/**
* @Assert\NotBlank(groups={"group1"})
* @Assert\Type(type="integer", groups={"group1"})
* @Assert\Range(min=0, groups={"group1"})
* @ORM\Column(type="integer")
*/
private $cableCount;
这是表单类型中的相应字段:
$builder->add('cableCount', IntegerType::class, [
'label' => 'Cable Count',
'required' => true
]);
该字段使用向上和向下箭头呈现,用户可以增加和减少值,例如 1、2、3 ...
然而,用户也可以输入 3.45 并提交表格。不会弹出验证错误。只是该值四舍五入为 3。预期的行为是得到一个验证错误,通知用户该字段只能接受整数。
我该如何解决这个问题?
symfony 中是否有针对此的内置功能,或者我应该创建自定义约束?
您可以尝试像这样使用正则表达式断言:
/** @Assert\Regex(pattern="/^\d*$/") */
编辑:正如@JasonRoman 所提到的,您首先必须处理 IntegerType 会自动舍入您的输入。
Symfony 的 IntegerType will automatically round 无论您发送给它的数字是多少。在浏览器端,如果你使用 IntegerType 那么它通常会在你提交表单之前检查一个有效的整数。
为了得到你想要的,你应该使用NumberType。然后,您的 @Assert\Type(type="integer", groups={"group1"})
将在服务器上显示为 运行,如果您提交非整数,则会出现适当的错误。
唯一的问题是您丢失了 up/down 箭头。如果您想要,您必须使用 NumberType 的自定义表单主题进行覆盖。像这样:
{%- block number_widget -%}
{%- set type = form.vars.attr['int'] is defined and form.vars.attr['int']
? 'number'
: type|default('text')
-%}
{{ block('form_widget_simple') }}
{%- endblock number_widget -%}
然后在您的表单类型中,指定 attr
,如下所示:
$builder->add('cableCount', NumberType::class, [
'label' => 'Cable Count',
'required' => true,
'attr' => [
'int' => true,
]
]);
这是实体中的字段:
/**
* @Assert\NotBlank(groups={"group1"})
* @Assert\Type(type="integer", groups={"group1"})
* @Assert\Range(min=0, groups={"group1"})
* @ORM\Column(type="integer")
*/
private $cableCount;
这是表单类型中的相应字段:
$builder->add('cableCount', IntegerType::class, [
'label' => 'Cable Count',
'required' => true
]);
该字段使用向上和向下箭头呈现,用户可以增加和减少值,例如 1、2、3 ... 然而,用户也可以输入 3.45 并提交表格。不会弹出验证错误。只是该值四舍五入为 3。预期的行为是得到一个验证错误,通知用户该字段只能接受整数。
我该如何解决这个问题? symfony 中是否有针对此的内置功能,或者我应该创建自定义约束?
您可以尝试像这样使用正则表达式断言:
/** @Assert\Regex(pattern="/^\d*$/") */
编辑:正如@JasonRoman 所提到的,您首先必须处理 IntegerType 会自动舍入您的输入。
Symfony 的 IntegerType will automatically round 无论您发送给它的数字是多少。在浏览器端,如果你使用 IntegerType 那么它通常会在你提交表单之前检查一个有效的整数。
为了得到你想要的,你应该使用NumberType。然后,您的 @Assert\Type(type="integer", groups={"group1"})
将在服务器上显示为 运行,如果您提交非整数,则会出现适当的错误。
唯一的问题是您丢失了 up/down 箭头。如果您想要,您必须使用 NumberType 的自定义表单主题进行覆盖。像这样:
{%- block number_widget -%}
{%- set type = form.vars.attr['int'] is defined and form.vars.attr['int']
? 'number'
: type|default('text')
-%}
{{ block('form_widget_simple') }}
{%- endblock number_widget -%}
然后在您的表单类型中,指定 attr
,如下所示:
$builder->add('cableCount', NumberType::class, [
'label' => 'Cable Count',
'required' => true,
'attr' => [
'int' => true,
]
]);