使用 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 方法时,您会希望尽可能地远离表单(用传统术语来说)。正如您所注意到的,传统表单仅支持 POSTGET 方法,因此 PATCH 将不起作用。

或者,您可以做的是

  • 在客户端,维护域对象的JSON表示
  • 实现双向绑定(可选)
  • 不要提交表单,而是向您的服务器发出一个新的 PATCH HTTP 请求,其中包含 JSON 的新状态

您的服务器端不应再 handleRequest,而是 $form->submit($data)$data 应该从请求正文(如果有)中反序列化 JSON。如果你觉得超级懒惰,有一个包可以做到这一点:qandidate-labs/symfony-json-request-transformer :)

有了这个,你就绕过了 POST/GET 的形式限制,但你仍然保留了验证逻辑。

希望这对您有所帮助...