1

这是实体中的字段:

/**
* @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 中是否有内置功能,或者我应该创建一个自定义约束?

4

2 回答 2

3

Symfony 的IntegerType自动舍入您发送给它的任何数字。在浏览器端,如果您使用IntegerType ,那么它通常会在让您提交表单之前检查一个有效的整数。

为了得到你想要的,你应该使用NumberType。然后,您@Assert\Type(type="integer", groups={"group1"})将在服务器上运行,如果您提交非整数,则会出现相应的错误。

唯一的问题是您丢失了向上/向下箭头。如果需要,您必须使用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,
    ]
]);
于 2017-09-01T22:30:59.080 回答
0

您可以尝试像这样使用 Regex 断言:

/** @Assert\Regex(pattern="/^\d*$/") */

编辑:正如@JasonRoman 提到的,您首先必须处理将自动舍入您的输入的IntegerType 。

于 2017-09-01T22:16:46.510 回答