使用 PATCH 方法的 handleRequest()
handleRequest() with PATCH method
为避免使用多个 FormType
文件,我将使用 PATCH
方法提交表单。
但是 symfony handleRequest()
没有提交,因为表单配置和请求之间的方法不同。
首先在controller中设置form方法(为了能够提交)
$form=$this->createForm(UtilisateurType::class, $utilisateur, array(
'action'=>$this->generateUrl('security_edit_user', array('id'=>$utilisateur->getId())),
'method'=>'POST',
));
$form->handleRequest($request);
然后在提交时覆盖twig中的表单方法
<form action="{{ form.vars.action }}" method="{{ form.vars.method }}" name="{{ form.vars.name }}" enctype="multipart/form-data">
<!-- editor-fold -->
<input name="_method" type="hidden" value="PATCH">
<!-- editor-fold -->
</form>
问题出在handleRequest()
函数(vendor/symfony/symfony/src/Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationRequestHandler.php
)。
该函数将比较表单方法和请求方法,如果它们不同则阻止提交。
$method = $form->getConfig()->getMethod();
if ($method !== $request->getMethod()) {
return;
}
因此,我想知道这种情况背后的原因。为什么 Symfony 检查表单和请求的方法是否相同。
那么,correct/bypass这样可以吗?您建议如何操作?
通常,当您想使用 REST-ish 方法时,您会希望尽可能地远离表单(用传统术语来说)。正如您所注意到的,传统表单仅支持 POST
和 GET
方法,因此 PATCH
将不起作用。
或者,您可以做的是
- 在客户端,维护域对象的
JSON
表示
- 实现双向绑定(可选)
- 不要提交表单,而是向您的服务器发出一个新的
PATCH
HTTP 请求,其中包含 JSON
的新状态
您的服务器端不应再 handleRequest
,而是 $form->submit($data)
。 $data
应该从请求正文(如果有)中反序列化 JSON
。如果你觉得超级懒惰,有一个包可以做到这一点:qandidate-labs/symfony-json-request-transformer :)
有了这个,你就绕过了 POST
/GET
的形式限制,但你仍然保留了验证逻辑。
希望这对您有所帮助...
为避免使用多个 FormType
文件,我将使用 PATCH
方法提交表单。
但是 symfony handleRequest()
没有提交,因为表单配置和请求之间的方法不同。
首先在controller中设置form方法(为了能够提交)
$form=$this->createForm(UtilisateurType::class, $utilisateur, array(
'action'=>$this->generateUrl('security_edit_user', array('id'=>$utilisateur->getId())),
'method'=>'POST',
));
$form->handleRequest($request);
然后在提交时覆盖twig中的表单方法
<form action="{{ form.vars.action }}" method="{{ form.vars.method }}" name="{{ form.vars.name }}" enctype="multipart/form-data">
<!-- editor-fold -->
<input name="_method" type="hidden" value="PATCH">
<!-- editor-fold -->
</form>
问题出在handleRequest()
函数(vendor/symfony/symfony/src/Symfony/Component/Form/Extension/HttpFoundation/HttpFoundationRequestHandler.php
)。
该函数将比较表单方法和请求方法,如果它们不同则阻止提交。
$method = $form->getConfig()->getMethod();
if ($method !== $request->getMethod()) {
return;
}
因此,我想知道这种情况背后的原因。为什么 Symfony 检查表单和请求的方法是否相同。
那么,correct/bypass这样可以吗?您建议如何操作?
通常,当您想使用 REST-ish 方法时,您会希望尽可能地远离表单(用传统术语来说)。正如您所注意到的,传统表单仅支持 POST
和 GET
方法,因此 PATCH
将不起作用。
或者,您可以做的是
- 在客户端,维护域对象的
JSON
表示 - 实现双向绑定(可选)
- 不要提交表单,而是向您的服务器发出一个新的
PATCH
HTTP 请求,其中包含JSON
的新状态
您的服务器端不应再 handleRequest
,而是 $form->submit($data)
。 $data
应该从请求正文(如果有)中反序列化 JSON
。如果你觉得超级懒惰,有一个包可以做到这一点:qandidate-labs/symfony-json-request-transformer :)
有了这个,你就绕过了 POST
/GET
的形式限制,但你仍然保留了验证逻辑。
希望这对您有所帮助...