gpt4 book ai didi

php - Symfony 2 是否支持部分表单绑定(bind)?

转载 作者:可可西里 更新时间:2023-10-31 23:08:42 24 4
gpt4 key购买 nike

我的问题:

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

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

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

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

最佳答案

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

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

使用 PATCH 请求处理部分绑定(bind)

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

在 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 文档的内容解释了大多数浏览器不支持发送 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

关于php - Symfony 2 是否支持部分表单绑定(bind)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19793767/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com