我的问题:
Symfony 2是否支持PATCH
个请求或任何类型的部分表单内容提交?如果是这样,是否有“正确”(或更准确地说是“首选”)方式?
除了PRE_BIND
(见下文)事件方法之外,还有其他任何模式或方法可以解决这个问题吗?如果还有其他方法可以解决这个问题,那么它们中的任何一种都被认为比其他方法更好或更差吗?
到目前为止我发现/完成的内容:根据Github上的拉取请求(#5576),已经完成了支持Symfony 2中部分表单绑定的工作(根据我的理解) ,针对Symfony 2.2)。但是,我在该拉取请求之外找不到任何指示如何使用部分表单绑定的文档或示例。
我发现的一个解决方案可能符合我的目的。方法是将事件订阅者附加到PRE_BIND
事件以获取表单类型,粗略搜索stackoverflow会产生以下答案,类似于我目前使用的答案:https://stackoverflow.com/a/11687863/657674。
答案 0 :(得分:14)
对于PATCH
请求,Symfony 2.3(可能更早?)本机支持部分模型更新。见下面的解释。
对于非PATCH
请求(例如PUT
和POST
),您仍然可以通过创建和注册事件订阅者来操作未提交的数据到原始数据来执行部分数据绑定值,或者您可以编写自定义请求处理程序以始终调用$form->submit()
方法,并将$clearMissing
设置为false
。
PATCH
请求处理部分绑定在深入研究Symfony的内部,并更好地了解事件订阅者和表单扩展之后,我偶然发现了HttpFoundationRequestHandler
类。基本上,从Symfony 2.3开始,在绑定表单的提交数据时,开发人员应调用$form->submit($request)
,而不是调用$form->handleRequest($request)
;这会调用附加的请求处理程序(默认为HttpFoundationRequestHandler
)。请求处理程序做了一些事情,但最重要的是它调用$form->submit()
的方式。如果请求方法false
告诉表单不将未映射的表单数据绑定为{{1},则会将submit
值传递到表单的PATCH
方法中}值。
在Symfony 2.3中使用null
方法有一些警告可以通过Symfony的文档进一步解释:
<强> How to use HTTP Methods beyond GET and POST in Routes 强>
“不幸的是,生活并不那么简单,因为大多数浏览器都不支持发送PUT和DELETE请求。幸运的是,Symfony2为您提供了一种解决此限制的简单方法。通过在...中包含_method参数查询字符串或HTTP请求的参数,Symfony2将在匹配路由时将其用作方法。“
Symfony文档的上述引用解释了大多数浏览器不支持发送PATCH
,PUT
或PATCH
请求。这是一个问题,因为我们要利用Symfony对部分表单更新的原生支持,我们需要使用DELETE
请求。但是,Symfony为此提供了答案。文档告诉我们,我们可以使用PATCH
参数或表单值来欺骗我们想要的实际请求,Symfony将确切地知道我们的意思。但是,要理解_method
,您可能必须启用_method
配置选项,例如:
http_method_override
还有其他方法告诉Symfony表单应该使用哪种方法,可以在这里找到:Changing the Action and Method of a Form。