表单以“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”提交,但提交后将成为对象的主要内容,如果未能解决你的问题,请参考以下文章

在用户填写提交表单后将其重定向到他们的提交

HTML 表单 PHP 发布到自己以验证或提交到新页面

表单提交后将 PHP 变量回显到 HTML [重复]

使用php提交后将表单数据保留在字段内

提交后将 <input type="file"> 传递给其他表单

为什么Django引发IntegrityError:列“user_id”中的null值在提交表单时违反了非空约束?