我有一个名为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 => ''
。
任何帮助将不胜感激
答案 0 :(得分:1)
https://symfony.com/doc/current/reference/forms/types/choice.html#empty-data
表单数据转换器仍将应用于empty_data值。
在您的示例中,这是返回null的地方:
解决此问题的一种方法是添加一个模型转换器,该转换器将返回一个空字符串而不是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 ---”或值为''
(空字符串)的选项。 ...或者您可以按照警告提示添加自定义数据转换器。