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,
    ]
]);