对于PATCH 请求,Symfony 2.3(可能更早?)原生支持部分模型更新。请参阅下面的说明。
对于非PATCH 请求(例如PUT 和POST),您仍然可以通过创建和注册事件订阅者将未提交的数据操作为其原始值来执行部分数据绑定,或者您可以编写一个自定义请求处理程序,始终调用 $form->submit() 方法,并将 $clearMissing 设置为 false。
使用PATCH 请求处理部分绑定
在深入了解 Symfony 的内部结构并更好地了解事件订阅者和表单扩展之后,我偶然发现了 HttpFoundationRequestHandler 类。基本上,从 Symfony 2.3 开始,在绑定表单的提交数据时,开发人员应该调用 $form->handleRequest($request),而不是调用 $form->submit($request);这会调用附加的请求处理程序(默认为HttpFoundationRequestHandler)。请求处理程序做了一些事情,但最重要的是它如何调用$form->submit()。如果请求方法是PATCH 告诉表单不将未提供的表单数据绑定为null 值,它会将false 的值传递给表单的submit 方法。
在 Symfony 2.3 中使用 PATCH 方法有一些注意事项,可以通过 Symfony 的文档进一步解释:
How to use HTTP Methods beyond GET and POST in Routes:
“不幸的是,生活并非如此简单,因为大多数浏览器不支持发送 PUT 和 DELETE 请求。幸运的是 Symfony2 为您提供了一种解决此限制的简单方法。通过在查询一个 HTTP 请求的字符串或参数,Symfony2 在匹配路由时会使用这个方法。”
上述来自 Symfony 文档的引用解释了大多数浏览器不支持发送 PUT、PATCH 或 DELETE 请求。这是一个问题,因为我们要利用 Symfony 对部分表单更新的原生支持,我们需要使用 PATCH 请求。然而,Symfony 提供了一个答案。文档告诉我们,我们可以使用_method 参数或表单值来欺骗我们想要的实际请求,Symfony 会确切地知道我们的意思。要理解_method,您可能必须启用http_method_override 配置选项,例如:
# config.yml
framework:
http_method_override: true
...
还有其他方法可以告诉 Symfony 表单应该使用什么方法,这些可以在这里找到:Changing the Action and Method of a Form。