Symfony — десятичное число в поле целочисленного типа не вызывает ошибки проверки

Это поле в Entity:

/**
* @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 встроенная функция для этого или я должен создать собственное ограничение?

1

Решение

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

Другие решения

Вы можете попробовать использовать Regex assert следующим образом:

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

Редактировать: как упомянуто @JasonRoman, вы сначала должны иметь дело с IntegerType который будет автоматически округлять ваши входы.

0

По вопросам рекламы [email protected]