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 встроенная функция для этого или я должен создать пользовательское ограничение?
2 ответа
IntegerType Symfony будет автоматически округлять любое число, которое вы ему отправите. На стороне браузера, если вы используете 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,
]
]);
Вы можете попробовать использовать Regex assert следующим образом:
/** @Assert\Regex(pattern="/^\d*$/") */
Редактировать: Как упомянуто @JasonRoman, вы сначала должны иметь дело с IntegerType, который будет автоматически округлять ваши входные данные.