使用PATCH方法的handleRequest()

时间:2018-07-16 07:58:06

标签: php symfony symfony-forms symfony-3.4

为避免使用多个FormType文件,我正在使用PATCH方法提交表单。
但是symfony handleRequest()不会提交,因为表单配置和请求之间的方法有所不同。

首先,在控制器中设置表单方法(以便能够提交)

$form=$this->createForm(UtilisateurType::class, $utilisateur, array(
    'action'=>$this->generateUrl('security_edit_user', array('id'=>$utilisateur->getId())),
    'method'=>'POST',
));
$form->handleRequest($request);

提交后在树枝中改写表格方法

<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)上。
该功能将比较form方法和request方法,并防止它们不同时提交。

$method = $form->getConfig()->getMethod();
if ($method !== $request->getMethod()) {
    return;
}

因此,我想知道这种情况背后的原因。为什么Symfony会检查表单和请求中的方法是否相同。

然后,可以纠正/绕过此问题吗?您会如何要求这样做?

1 个答案:

答案 0 :(得分:1)

通常,当您要使用REST-ish方法时,您将希望尽可能地远离表单(按传统术语)。如您所知,传统形式仅支持POSTGET方法,因此PATCH不起作用。

或者,您可以做的是

< ul>
  • 在客户端,维护域对象的JSON表示形式
  • 实现双向绑定(可选)
  • 不提交表单,而是向服务器发送新的PATCH HTTP请求,其中包含JSON个新状态
  • 您的服务器端不应再handleRequest,而应该$form->submit($data)$data应该从请求正文中反序列化JSON(如果有)。如果您觉得自己很懒惰,可以使用捆绑软件:qandidate-labs/symfony-json-request-transformer:)

    以此来绕过POST / GET的格式限制,但是您仍然保留验证逻辑。

    希望这对您有帮助...