gpt4 book ai didi

Symfony3 : How to update boolean to false using PATCH method

转载 作者:行者123 更新时间:2023-12-02 21:22:08 27 4
gpt4 key购买 nike

我有一个大实体和一个大形式。更新实体时,我仅通过 ajax 调用呈现表单的部分内容。在客户端,我使用 Jquery 和 html5 FormData,因此我也可以在表单中发送文件。为了确保未渲染的字段在此过程中不会被设置为 null,我使用 PATCH 方法

因此,当请求中不存在某个字段时,Symfony 会保持原样

但是,当我更新的字段是一个设置为 true 的 bool 值(呈现为复选框)并且我想将其设置为 false 时,它​​不会在请求中传递,因此我的更新被忽略 .

是否有一种简单的方法可以强制未选中的复选框出现在请求中?

编辑
感谢 Felix Kling 对 this question 的评论,我找到了一种强制未选中的复选框出现在请求中的方法。 :

$("input:checkbox:not(:checked)").each(function() {
formData.set($(this).attr('name'), formData.has($(this).attr('id')) ? '1' : '0');
});

不幸的是,这并没有解决我的问题,因为 Symfony 的行为:
- 使用PUT时,如果 bool 字段出现在请求中,则它被设置为true,无论其值如何(即使它是“0”或“false”)。
- 使用PATCH方法时,请求中未出现的字段将被忽略。

可以用 DataTransformer 解决这个问题吗? (我没用过)

最佳答案

你说得完全正确,如果方法是 PATCH,Symfony 会忽略它,因为 this line in Request Handler :

$form->submit($data, 'PATCH' !== $method);

现在,如果这是一个选项,我通常建议您使用 PUT 请求,但如果不是,则使用 FormInterface::submit($subscribedData, $ clearMissing = true) 就是您所追求的。

“正确”的方法可能是自己实现 Symfony\Component\Form\RequestHandlerInterface这将强制 $clearMissingtrue

其他方法要简单得多,但可能不适用于所有用例:直接使用 $form->submit()

如果您有以下代码:

$form->handleRequest($request);

你可以这样做:

$form->submit($request->get($form->getName()), true);

您还可以省略第二个参数,因为 true 是默认值

关于Symfony3 : How to update boolean to false using PATCH method,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35187867/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com