Symfony 请求中不存在的字段在实体中设置为空
我制作了RESTAPI控制器。我有一个表单SliderApiType,我在其中传递我想要编辑的字段。如果我只传递一个字段,例如'label',那么只有这个字段会被更改,并且这个表单中的所有其他字段都将为空 ММ表格:Symfony 请求中不存在的字段在实体中设置为空,symfony,Symfony,我制作了RESTAPI控制器。我有一个表单SliderApiType,我在其中传递我想要编辑的字段。如果我只传递一个字段,例如'label',那么只有这个字段会被更改,并且这个表单中的所有其他字段都将为空 ММ表格: public function buildForm(FormBuilderInterface $builder, array $options) { $builder ->add('label', TextType::c
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、命令行或平面文件中检索数据呢?您的解决方案适用于表单,仅对表单有效