empty_data ChoiceType返回null

时间:2019-11-13 09:31:37

标签: symfony

我有一个名为spring-web 4.x的字段,该字段是可选的。我正在使用以下代码创建表单

defaultWarehouse

问题在于,每当用户不选择仓库时,我都会遇到以下错误: class UserType extends AbstractType { ... public function buildForm(FormBuilderInterface $builder, array $options) { $builder->add('defaultWarehouse', ChoiceType::class, [ 'choices' => $warehouses, 'placeholder' => 'Choose warehouse', 'required' => false, 'empty_data' => '', ]) } } 使我相信Symfony正在将一个空字符串转换为Expected argument of type "string", "NULL" given at property path "defaultWarehouse".(这显然不是预期的行为)。

通过null发送回服务器时,我可以确认该请求具有defaultWarehouse => ''

任何帮助将不胜感激

2 个答案:

答案 0 :(得分:1)

https://symfony.com/doc/current/reference/forms/types/choice.html#empty-data

  

表单数据转换器仍将应用于empty_data值。

在您的示例中,这是返回null的地方:

https://github.com/symfony/form/blob/master/Extension/Core/DataTransformer/ChoiceToValueTransformer.php#L44

解决此问题的一种方法是添加一个模型转换器,该转换器将返回一个空字符串而不是null。

    class UserType extends AbstractType {
    ...
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $builder->add('defaultWarehouse', ChoiceType::class, [
                'choices' => $warehouses,
                'placeholder' => 'Choose warehouse',
                'required' => false,
                'empty_data' => '',
            ]);

            $builder->get('defaultWarehouse')->addModelTransformer(
                new CallbackTransformer(
                    function ($value) {
                        return $value;
                    }, function ($value) {

                        if (null === $value) {
                            return '';
                        }

                        return $value;
                    }
                )
            );

        }
    }

答案 1 :(得分:0)

来自ChoiceType docs(该小节末尾的警告框):

  

表单数据转换器仍将应用于empty_data值。这意味着空字符串将被强制转换为null。如果您明确想返回空字符串,请使用自定义数据转换器。

一个可行的解决方案是添加一个选项“ --- none ---”或值为''(空字符串)的选项。 ...或者您可以按照警告提示添加自定义数据转换器。