Почему Symfony NotNull противопоказанием выдает ошибку за ложь? - PullRequest
0 голосов
/ 06 июня 2018

У меня проблема с ограничением NotNull в проверке формы Symfony.

Использование следующей формы:

class SchedulableType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->addEventListener(FormEvents::PRE_SUBMIT, function (FormEvent $event) use ($options) {
            $form = $event->getForm();
                $form
                    ->add('dateFrom', DateTimeType::class, array(
                        'constraints' => array(
                            new NotNull()
                        ),
                        'widget' => 'single_text', // In order to manage format
                        'format' => 'y-MM-dd HH:mm:ss'
                    ))
                    ->add('dateTo', DateTimeType::class, array(
                        'constraints' => array(
                            new NotNull()
                        ),
                        'widget' => 'single_text', // In order to manage format
                        'format' => 'y-MM-dd HH:mm:ss'
                    ))
                    ->add('value', $options['valueType'], $options['valueOptions']);
        });
    }

    public function configureOptions(OptionsResolver $resolver)
    {
        $resolver->setDefaults(array(
            'valueType' => null,
            'valueOptions' => array(),
        ));
    }
}

Данныев моем случае следующие:

array (size=3)
  'dateFrom' => boolean false
  'dateTo' => boolean false
  'value' => string 'value' (length=5)

Но я получаю следующее сообщение об ошибке:

{
    "status": "400",
    "title": "This value should not be null.",
    "source": {
        "source": {
            "pointer": "/SCHEDULABLE/dateFrom/0"
        }
    }
},
{
    "status": "400",
    "title": "This value should not be null.",
    "source": {
        "source": {
            "pointer": "/SCHEDULABLE/dateTo/0"
        }
    }
}

Почему ограничение NotNull приводит к ошибкеесли мое значение равно false?

Вы можете взглянуть на класс ограничений: symfony / src / Symfony / Component / Validator / Constraints / NotNullValidator.php

PS : проверка формы используется в API, поэтому ошибка отформатирована в JSON.

1 Ответ

0 голосов
/ 06 июня 2018

Это в основном потому, что эти поля DateTimeType, поэтому он пытается преобразовать значение в допустимое значение \DateTime, и, поскольку в любом случае этого не произойдет, он хранит значение null.Помните, что цикл равен

  1. Обработка данных
  2. Заполнение объекта (или формы) через сеттер / сумматор / публичные свойства
  3. Проверка (фактически вы ответственныйдля этого через isValid())

Если вы хотите принять false и реализовать какую-то логику, например, «установить дату сегодня», вам нужно сделать это самостоятельно (возможно, с помощью FormEvents?)

...