Проверка формы Symfony 5.1 без класса данных

#php #forms #symfony #validation #symfony-forms

#php #формы #symfony #проверка #symfony-forms

Вопрос:

Я впервые создаю форму symfony на нашей устаревшей платформе (старый монолит, который мы все больше и больше рефакторингуем с помощью Symfony 5.1). На других платформах, работающих только на Symfony, мне несколько раз удавалось создавать формы и проверки без проблем (3.x, 4.x, 5.x).

Я наткнулся на странное поведение при попытке проверить длину значений или действительный адрес электронной почты. Когда я отправляю пустые поля, метод isValid() возвращает true без ограничения NotBlank. Для проверки на стороне сервера я отключил проверку клиента.

Я почти уверен, что старый код не мешает; но факт в том, что я использую файл php, на который меня перенаправляет контроллер.

Метод $form-> isValid() возвращает значение true, отправляя это поле без каких-либо данных:

 public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name', TextType::class, [
            'label' => $this->translator->trans('Your name'),
            'constraints' => [
                new AssertLength([
                    'min' => 3
                ])
            ]
        ]);
    [snip]    
}
  

Метод $form-> isValid() возвращает false при отправке этого поля пустым — что является желаемым результатом:

 public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->add('name', TextType::class, [
            'label' => $this->translator->trans('Your name'),
            'constraints' => [
                new AssertNotBlank([
                    'message' => $this->translator->trans('This value should not be blank'),
                ]),
                new AssertLength([
                    'min' => 3,
                    'minMessage' => $this->translator->trans('This value must be at least {{ limit }} characters long')
                ])
            ]
        ]);
    [snip]
}
  

Мне кажется неправильным добавлять ограничение NotBlank — я уже проверяю здесь минимальную длину. То же самое для других текстовых полей, также ограничение электронной почты возвращает значение true при оставлении поля пустым. Я читал документацию снова и снова (см.https://symfony.com/doc/current/validation.html#constraints-in-form-classes — так что это должно сработать), но я не знаю, что здесь происходит не так… Приведенное выше исправление было случайным :). Кто-нибудь может объяснить, зачем мне нужно ограничение NotBlank? Или я что-то пропустил …?

Комментарии:

1. Это сделано специально, вы можете увидеть это в примечании чуть ниже примера использования

2. Спасибо. Я пропустил это поле -.-

3. кроме того, вы можете удалить $this->translator->trans и просто оставить ключ перевода, он работает

Ответ №1:

Если вы зайдете в код средства проверки длины: https://github.com/symfony/symfony/blob/master/src/Symfony/Component/Validator/Constraints/LengthValidator.php

Вы можете видеть:

 if (null === $value || ('' === $value amp;amp; $constraint->allowEmptyString)) {
    return;
}
  

Считается лучше, чтобы общие ограничения не применялись к пустым значениям.
Допустим, пользователь может дополнительно ввести номер телефона. Если это необязательно, вы не можете вызвать сбой проверки для пустого значения. Таким образом, вы можете запретить пустое значение с ограничением NotBlank.

Конечно, это имеет меньше смысла при ограничении длины, но я предполагаю, что это делается таким же образом путем гармонизации. Что, если вы хотите разрешить пустое значение, но хотите, чтобы при отправке значения оно имело минимальную длину? Разделение ограничений делает проверку более гибкой.