表单以“null”提交,但提交后将成为对象
Posted
技术标签:
【中文标题】表单以“null”提交,但提交后将成为对象【英文标题】:Form is submitted with "null" but will be object after submit 【发布时间】:2021-10-22 18:13:13 【问题描述】:在调试完整的vendor/symfony/form/Form
数小时后,我只能发现FormEvents::SUBMIT
将我的null
值转换为Object
。
这是我的代码。
$form = $this->createForm(PersonType::class, new Person());
$form->submit($request->request->all(), false);
if ($form->isSubmitted() && $form->isValid())
$em->persist($entity);
$em->flush();
return $entity;
return $form->getErrors(true, true);
然后我发送这个请求。
POST /api/persons/e3d90966-b2e7-4503-959f-da989c73c185
"name": "firstName": "John", "lastName": "Doe"
它将人名设置为John Doe
。
现在我要清除它:
POST /api/persons/e3d90966-b2e7-4503-959f-da989c73c185
"name": null
然后瞧:名字仍然是John Doe
。
我正在使用自定义类型:
class NameType extends AbstractType
private EntityManagerInterface $manager;
public function __construct(EntityManagerInterface $manager)
$this->manager = $manager;
public function buildForm(FormBuilderInterface $builder, array $options)
parent::buildForm($builder, $options);
$builder
->add('firstName', TextType::class)
->add('lastName', TextType::class)
;
$builder->addModelTransformer(new NameTransformer($this->manager));
public function configureOptions(OptionsResolver $resolver)
$resolver->setDefaults([
'data_class' => Name::class,
'compound' => true
]);
并且通过以下方式使用:
$builder
->add('name', NameType::class)
;
更多信息:
【问题讨论】:
【参考方案1】:如果你在发帖
"name": null
那是父表单为空,因此没有子表单字段,您没有为字段或字段本身传递任何值。您没有为字段提交新值,因此没有任何更改。
我认为您需要将每个单独的字段值显式设置为 null
才能使其正常工作。以下示例之一应该可以解决问题:
POST /api/persons/e3d90966-b2e7-4503-959f-da989c73c185
"name": "firstName": null, "lastName": null
或
POST /api/persons/e3d90966-b2e7-4503-959f-da989c73c185
"name": "firstName": "", "lastName": ""
【讨论】:
以上是关于表单以“null”提交,但提交后将成为对象的主要内容,如果未能解决你的问题,请参考以下文章