Symfony 2是否支持部分表单绑定?

Sea*_*inn 9 php forms patch partial symfony

我的问题:

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

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

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

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

Sea*_*inn 14

对于PATCH请求,Symfony 2.3(可能更早?)本身支持部分模型更新.见下面的解释.

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

使用PATCH请求处理部分绑定

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

PATCH在Symfony 2.3中使用该方法有一些警告可以通过Symfony的文档进一步解释:

如何在路由中使用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
    ...
Run Code Online (Sandbox Code Playgroud)

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