为什么Symfony NotNull禁令会抛出错误?

时间:2018-06-06 07:42:19

标签: php symfony symfony-forms symfony-3.4

我在Symfony表单验证中遇到了处理NotNull约束的问题。

使用以下表格:

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"
        }
    }
}

如果我的值为false

,为什么NotNull约束会引发错误

您可以查看约束类:symfony/src/Symfony/Component/Validator/Constraints/NotNullValidator.php

PS :表单验证用于API,这就是错误是JSON格式化的原因。

1 个答案:

答案 0 :(得分:2)

这基本上是因为这些字段是DateTimeType所以它tries to cast value to a valid \DateTime并且因为它不会发生,所以它存储null值。 请记住,循环是

  1. 数据处理
  2. 通过setter / adder / public properties
  3. 的对象(或表单)填充
  4. 验证(实际上您通过isValid()
  5. 负责此操作

    如果您想接受false并实施某种逻辑,例如“设置今天日期”,您需要自己做(可能使用FormEvents?)