9

我的问题:

  1. Symfony 2 是否支持PATCH请求或任何类型的部分表单内容提交?如果是这样,是否有“正确”(或更准确地说是“首选”)方法来做到这一点?

  2. 除了PRE_BIND(见下文)事件方法之外,还有其他模式或方法来解决这个问题吗?如果有其他方法可以解决这个问题,它们中的任何一种被认为比其他方法更好或更差吗?

到目前为止我发现/做了什么:根据 Github 上的拉取请求(#5576),已完成工作以支持 Symfony 2 中的部分表单绑定(据我了解,目标是 Symfony 2.2)。但是,我在该拉取请求之外找不到任何说明如何使用部分表单绑定的文档或示例。

我发现的一种解决方案可能适合我的目的。该方法是将事件订阅者附加到PRE_BIND表单类型的事件,粗略搜索 stackoverflow 得到以下答案,这与我目前使用的答案相似:https ://stackoverflow.com/a/11687863/657674 。

4

1 回答 1

14

对于PATCH请求,Symfony 2.3(可能更早?)原生支持部分模型更新。请参阅下面的说明。

对于非PATCH请求(例如PUTPOST),您仍然可以通过创建和注册事件订阅者将未提交的数据操作为其原始值来执行部分数据绑定,或者您可以编写自定义请求处理程序以始终调用设置为的$form->submit()方法.$clearMissingfalse

处理PATCH请求的部分绑定

在深入了解 Symfony 的内部结构并更好地理解事件订阅者和表单扩展之后,我偶然发现了这HttpFoundationRequestHandler门课。基本上,从 Symfony 2.3 开始,$form->submit($request)开发人员应该调用 ; 而不是在绑定表单提交的数据时调用$form->handleRequest($request);这会调用附加的请求处理程序(默认情况下HttpFoundationRequestHandler)。请求处理程序做了一些事情,但最重要的是它如何调用$form->submit(). 如果请求方法告诉表单不要将未提供的表单数据绑定为值,它会将值传递给false表单的方法。submitPATCHnull

在 Symfony 2.3 中使用该方法有一些注意事项PATCH,可以通过 Symfony 的文档进一步解释:

如何在 Routes 中使用 GET 和 POST 之外的 HTTP 方法

“不幸的是,生活并不是这么简单,因为大多数浏览器不支持发送 PUT 和 DELETE 请求。幸运的是,Symfony2 为您提供了一种解决此限制的简单方法。通过在查询字符串中包含 _method 参数或HTTP 请求,Symfony2 在匹配路由时会使用这个作为方法。”

以上来自 Symfony 文档的引用解释了大多数浏览器不支持发送PUT、、PATCHDELETE请求。这是一个问题,因为要利用 Symfony 对部分表单更新的原生支持,我们需要使用PATCH请求。然而,Symfony 提供了一个答案。文档告诉我们,我们可以使用_method参数或表单值来欺骗我们想要的实际请求,Symfony 将准确地知道我们的意思。为了_method理解,您可能必须启用http_method_override配置选项,例如:

# config.yml
framework:
    http_method_override: true
    ...

还有其他方法可以告诉 Symfony 表单应该使用什么方法,这些可以在这里找到:改变表单的动作和方法

于 2013-11-08T19:31:47.517 回答