Symfony 请求中不存在的字段在实体中设置为空

Symfony 请求中不存在的字段在实体中设置为空,symfony,Symfony,我制作了RESTAPI控制器。我有一个表单SliderApiType,我在其中传递我想要编辑的字段。如果我只传递一个字段,例如'label',那么只有这个字段会被更改,并且这个表单中的所有其他字段都将为空 ММ表格: public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('label', TextType::c

我制作了RESTAPI控制器。我有一个表单SliderApiType,我在其中传递我想要编辑的字段。如果我只传递一个字段,例如'label',那么只有这个字段会被更改,并且这个表单中的所有其他字段都将为空

ММ表格:

    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('label', TextType::class, ['label' => 'Заголовок', 'required' => false])
            ->add('description', TextType::class, ['label' => 'Описание', 'required' => false])
            ->add('serialNumber', IntegerType::class, ['label' => 'Номер', 'required' => false])
            ->add('picture', IntegerType::class, [
                'invalid_message' => 'picture is not a valid',
            ])
            ->add('send', SubmitType::class, ['label' => 'Отправить'])
        ;

        $builder->get('picture')
            ->addModelTransformer($this->transformer);
    }
我在其中执行编辑操作的控制器:

    public function edit(Slider $slideId, Request $request, EntityManagerInterface $em)
    {
        $form = $this->createForm(SliderApiType::class, $slideId);
        $data = json_decode($request->getContent(), true);
        $form->submit($data);
        if (!($form->isSubmitted() && $form->isValid())) {
            return $this->handleView($this->view($form->getErrors(true)));
        }

        $em = $this->getDoctrine()->getManager();
        $em->persist($slideId);
        $em->flush();

        $context = new Context();
        $context->addGroup('slider_create');
        $view = $this->view($slideId);
        $view->setContext($context);

        return $this->handleView($view);
    }
如果在json中传递此字段:

{
  "label": "string",
  "description": "string",
  "picture": 1
}
一切都很好

但是如果我传递这个json:

{
  "label": "string"
}
字段标签设置字符串的方式,但字段描述和图片设置为空


如何使其在我传递字段时,只对其进行编辑,而其他两个字段不为空?

我还没有编写任何rest API,但通过谷歌搜索,您似乎可以使用submit函数的第二个参数:

$form->submit($data, false);
这是假设此处的函数仅用于更新现有实体数据修补/放置方法-如果希望在同一操作中支持多个方法,则需要检查请求方法类型:

$clearMissing = $request->getMethod() != 'PATCH';
$form->submit($data, $clearMissing);

我建议你把这个逻辑直接放在你的实体中。这样,您就可以确信,无论何时更新相同的信息,它都将应用相同的逻辑,而不仅仅是在控制器中。对于每个字段,类似于以下内容:

public function setField(string $newValue)
{
    if (!empty($newValue)) {
        $this->field = $newValue;
    }

    return $this;
}

是什么阻止您为此编写代码?我发现给定的代码和JSON输入之间没有任何联系。我稍微纠正了我的问题。你确定要编写如此复杂的机制吗?为什么不传输所有字段?是的,我知道它是什么,但我不知道怎么做。它不起作用,我尝试过如果你使用rest api,你没有$form->submit。很抱歉听说它不起作用。我不明白你的评论的括号部分是什么意思-我很确定你在rest api操作处理中有$form->submit可用,似乎有很多这样的例子-好像你是对的,我不注意,发现$form->submit$one,false并将false设置为第二个参数我建议我的问题;它解决了我的问题。如果你像我一样写,你实际上不需要写很多代码。那么如果你想从API、命令行或平面文件中检索数据呢?您的解决方案适用于表单,仅对表单有效