【问题标题】:Does Symfony 2 support partial form binding?Symfony 2 是否支持部分表单绑定?
【发布时间】:2013-11-16 14:37:00
【问题描述】:

我的问题:

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

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

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

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

【问题讨论】:

    标签: php forms symfony patch partial


    【解决方案1】:

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

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

    使用PATCH 请求处理部分绑定

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

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

    How to use HTTP Methods beyond GET and POST in Routes:

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

    上述来自 Symfony 文档的引用解释了大多数浏览器不支持发送 PUTPATCHDELETE 请求。这是一个问题,因为我们要利用 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多