Symfony 2是否支持部分形式绑定?


Does Symfony 2 support partial form binding?

我的问题:

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

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

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

找到的一个解决方案可能适合我的目的。方法是将事件订阅者附加到表单类型的PRE_BIND事件,粗略搜索 stackoverflow 会产生以下答案,类似于我目前正在使用的答案:https://stackoverflow.com/a/11687863/657674。

对于PATCH请求,Symfony 2.3(也许更早?)本身支持部分模型更新。请参阅下面的解释。

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

处理具有PATCH请求的部分绑定

在进一步深入研究了Symfony的内部结构,

并对事件订阅者和表单扩展有了更好的理解之后,我偶然发现了HttpFoundationRequestHandler类。 基本上,从Symfony 2.3开始,在绑定表单提交的数据时,开发人员不应该调用$form->submit($request),而应该调用$form->handleRequest($request); 这将调用附加的请求处理程序(默认HttpFoundationRequestHandler)。请求处理程序做了几件事,但最重要的是它如何调用$form->submit()。如果请求方法PATCH告诉表单不要将未提供的表单数据绑定为null值,则它将值 false 传递到表单的 submit 方法中。

在Symfony

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

如何在路由中使用 GET 和 POST 之外的 HTTP 方法:

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

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

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

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