For PATCH
请求,Symfony 2.3(也许更早?)本身支持部分模型更新。请参阅下面的解释。
For non-PATCH
请求(例如PUT
and POST
),您仍然可以通过创建和注册事件订阅者来将未提交的数据操作为其原始值来执行部分数据绑定,或者您可以编写自定义请求处理程序以始终调用$form->submit()
方法与$clearMissing
set to false
.
处理部分绑定PATCH
要求
在深入研究 Symfony 的内部结构并更好地了解事件订阅者和表单扩展之后,我偶然发现了HttpFoundationRequestHandler
班级。基本上,从 Symfony 2.3 开始,不再调用$form->submit($request)
绑定表单提交的数据时,开发人员应该调用$form->handleRequest($request)
;这会调用附加的请求处理程序(默认情况下HttpFoundationRequestHandler
)。请求处理程序做了一些事情,但最重要的是它如何调用$form->submit()
。它传递的值为false
进入表格的submit
method 如果请求方法是PATCH
告诉形式not将未提供的表单数据绑定为null
values.
使用时有一些注意事项PATCH
Symfony 2.3 中的方法可以通过 Symfony 文档进一步解释:
如何在路由中使用 GET 和 POST 之外的 HTTP 方法 http://symfony.com/doc/master/cookbook/routing/method_parameters.html:
“不幸的是,生活并没有这么简单,因为大多数浏览器不支持发送 PUT 和 DELETE 请求。幸运的是,Symfony2 为您提供了一种解决此限制的简单方法。通过在查询字符串或参数中包含 _method 参数HTTP请求,Symfony2在匹配路由时会使用这个方法。”
上面引用 Symfony 文档解释了大多数浏览器不支持发送PUT
, PATCH
, or DELETE
要求。这是一个问题,因为我们要利用 Symfony 对部分表单更新的本机支持,我们需要使用PATCH
要求。然而,Symfony 对此提供了答案。文档告诉我们,我们可以使用_method
参数或表单值来欺骗我们想要的实际请求,Symfony 会确切地知道我们的意思。为了_method
不过,为了理解,您可能必须启用http_method_override
配置选项,例如:
# config.yml
framework:
http_method_override: true
...
还有其他方法告诉 Symfony 表单应该使用什么方法,可以在这里找到:更改表单的操作和方法 http://symfony.com/doc/master/book/forms.html#changing-the-action-and-method-of-a-form.