Проверка целочисленного ввода из формы
У меня есть объект с несколькими полями в нем. Один из них проверяется после отправки формы следующим образом:
/**
* @var integer $anzahl
*
* @ORM\Column(name="anzahl", type="integer")
* @Assert\NotBlank(message="Bitte geben Sie eine Kistenanzahl an.")
* @Assert\Type(type="numeric", message="Die Kistenanzahl muss eine Zahl sein.")
* @Assert\Min(limit="1", message="Sie müssen mindestens eine Kiste suchen oder anbieten.")
*/
private $anzahl;
У меня возникают две проблемы с этим решением:
Следует принимать только целые значения выше нуля. Однако эти валидации принимаются и поплавки/парные. Однако, если я изменяю @Assert\Type(type="numeric")
на @Assert\Type(type="integer")
, вход не проверяется как истинный. Как я могу подтвердить свой ввод как целочисленное значение?
Другая проблема заключается в том, что после ввода явно недопустимого значения (например, строки букв) я получаю не только мое сообщение об ошибке для проверки типа, но также и английское сообщение "Это значение должно быть допустимым числом". Откуда взялось это сообщение и как я могу избавиться от него?
Ответы
Ответ 1
Вы должны использовать:
@Assert\Type(type="integer")
Но будьте осторожны, вы должны использовать его с помощью IntegerType
, а не NumberType
или TextType
:
Symfony\Component\Form\Extension\Core\Type\IntegerType
IntegerType
идентичен NumberType
, за исключением того, что он объединяет собственный преобразователь данных.
Ответ 2
Если тип поля должен быть строкой, вы можете использовать это вместо:
/**
* @Assert\Type(type="digit")
*/
Хотя в документации не упоминается , TypeValidator
также использует функции ctype_*
.
См. \Symfony\Component\Validator\Constraints\TypeValidator
:
public function validate($value, Constraint $constraint)
{
...
$ctypeFunction = 'ctype_'.$type;
...
} elseif (function_exists($ctypeFunction) && call_user_func($ctypeFunction, $value)) {
...
}
Ответ 3
Это работает для меня:
->add('field_name', 'integer', array(
'label' => 'Your label here',
'data' => 0, // default value
'precision' => 0, // disallow floats
'constraints' => array(
new Assert\NotBlank(),
new Assert\Type('integer'),
new Assert\Regex(array(
'pattern' => '/^[0-9]\d*$/',
'message' => 'Please use only positive numbers.'
)
),
new Assert\Length(array('max' => 2))
)
))
Ответ 4
Вы можете использовать
/**
* @Assert\Regex(pattern="/\d+/")
*/
или создать валидатор с ctype_digit
.
Ответ 5
Мне пришлось использовать number
в типе поля формы, но рядом с меткой ввода он показывал звездочку *
, хотя это необязательно. Поэтому мне пришлось использовать 'required' => false
. Тип поля формы integer
не работал. Основной тип данных полей - smallint
.
->add('storey', 'number', array('required' => false))
Ограничение Regex
в YML тоже не работает, а тип integer
или ничего не предусмотрено. Я не знаю, почему
storey:
- Regex: '/^[0-9]+$/'
Моя версия Symfony - 2.7.
Ответ 6
Начиная с версии Symfony v2.3 вы должны использовать:
/**
* @Assert\Type(type="integer")
* @Assert\GreaterThan(0)
*/
Но имейте в виду, что тип поля формы должен быть целым (IntegerType::class
), иначе я получаю отрицательную проверку.