【问题标题】:Form is submitted with "null" but will be object after submit表单以“null”提交,但提交后将成为对象
【发布时间】: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)
;

更多信息:

【问题讨论】:

    标签: php symfony symfony-forms symfony5


    【解决方案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": ""}
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-17
      • 1970-01-01
      • 2016-07-30
      相关资源
      最近更新 更多