> Symfony 2是否支持PATCH请求或任何类型的部分表单内容提交?如果是这样,是否有“正确”(或更准确地说,“首选”)的方式呢?
>除了PRE_BIND(见下文)事件方法外,还有其他模式或方法来解决这个问题吗?如果还有其他方法来解决这个问题,他们中的任何一个比别人更好还是更糟?
到目前为止我已经发现/完成了:根据Github(#5576)的提出要求,已经完成了在Symfony 2中支持部分格式绑定的工作(从我的理解,瞄准Symfony 2.2).但是,我找不到任何文档或示例以外的该拉请求,指示如何使用部分表单绑定.
我找到的一个解决方案可能适合我的目的.该方法是将一个事件订阅者附加到一个表单类型的PRE_BIND事件中,粗略搜索stackoverflow产生了与我目前使用的类似的答案:https://stackoverflow.com/a/11687863/657674.
对于非PATCH请求(例如PUT和POST),您仍然可以通过创建和注册事件订户来执行部分数据绑定,以将未提交的数据操作为其原始值,或者您可以编写一个自定义请求处理程序来始终调用$form-> submit()方法,$clearMissing设置为false.
使用PATCH请求处理部分绑定
在进一步挖掘Symfony的内部部分之后,更好地了解了事件订阅者和表单扩展,我偶然发现了HttpFoundationRequestHandler类.基本上,作为Symfony 2.3,而不是在绑定表单的提交数据时调用$form-> submit($request),开发人员应该调用$form-> handleRequest($request);这将调用附加的请求处理程序(默认为HttpFoundationRequestHandler).请求处理程序做了一些事情,但最重要的是它如何调用$form-> submit().如果请求方法是PATCH告知该表单不将未提供的表单数据绑定为空值,则它将false值传递到表单的提交方法中.
在Symfony 2.3中使用PATCH方法有一些注意事项,可以通过Symfony的文档进一步解释:
How to use HTTP Methods beyond GET and POST in Routes:
“Unfortunately,life isn’t quite this simple,since most browsers do not support sending PUT and DELETE requests. Fortunately Symfony2 provides you with a simple way of working around this limitation. By including a _method parameter in the query string or parameters of an HTTP request,Symfony2 will use this as the method when matching routes.”
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.