【问题标题】:handleRequest() with PATCH method带有 PATCH 方法的 handleRequest()
【发布时间】:2018-12-23 17:19:12
【问题描述】:

为避免使用多个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);

然后在提交时覆盖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 会检查表单和请求的方法是否相同。

那么,是否可以纠正/绕过这个问题?你会建议怎么做?

【问题讨论】:

    标签: php symfony symfony-forms symfony-3.4


    【解决方案1】:

    通常,当您想使用 REST-ish 方法时,您会希望尽可能远离表单(以传统术语)。正如您所注意到的,传统形式仅支持 POSTGET 方法,因此 PATCH 将不起作用。

    另外,你可以做的是

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

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

    这样,您可以绕过POST/GET 的表单限制,但仍保留验证逻辑。

    希望这会有所帮助...

    【讨论】:

    • 我明白了……我想这是没办法的,我会把我的FormType 拆分成几个文件。我不熟悉 REST 之类的东西。感谢您的回复。
    猜你喜欢
    • 2020-03-09
    • 2021-05-26
    • 1970-01-01
    • 2022-10-13
    • 1970-01-01
    • 2013-01-31
    • 1970-01-01
    • 2011-08-22
    • 1970-01-01
    相关资源
    最近更新 更多