Проверка целочисленного ввода из формы

У меня есть объект с несколькими полями в нем. Один из них проверяется после отправки формы следующим образом:

/**
 * @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), иначе я получаю отрицательную проверку.