【问题标题】:Symfony delete form isSubmitted() return false when CSRF protection deactivated当 CSRF 保护停用时,Symfony 删除表单 isSubmitted() 返回 false
【发布时间】:2018-03-01 18:04:32
【问题描述】:

基本上这段代码打印为真:

/**
 * Deletes myentity.
 *
 * @Route("/{id}", name="myentity_delete")
 * @Method("DELETE")
 */
public function deleteAction(Request $request, MyEntity $entity) {
    $form = $this->createDeleteForm($entity);
    $form->handleRequest($request);

    var_dump($form->isSubmitted());
    die;
    if ($form->isSubmitted() && $form->isValid()) {
        $em = $this->getDoctrine()->getManager();
        $em->remove($invitation);
        $em->flush();
    }

    return $this->redirectToRoute('homepage');
}

/**
 * Creates a form to delete a myentity.
 *
 * @param MyEntity $entity The entity
 * @return Form The form
 */
private function createDeleteForm(MyEntity $entity) {
    return $this->createFormBuilder($entity)
                    ->setMethod('DELETE')
                    ->getForm();
}

但如果我更改 createDeleteForm() 方法以禁用 CSRF 保护,它会打印 false(isSubmitted() return false):

private function createDeleteForm(MyEntity $entity) {
    return $this->createFormBuilder($entity, array('csrf_protection' => false))
                    ->setMethod('DELETE')
                    ->getForm();
}

我需要这样做,因为我想发送一封电子邮件,其中嵌入了删除表单。

编辑 1: 即使表单显示在网站上,它仍然不起作用,因此错误与电子邮件无关。

【问题讨论】:

  • 邮件中的删除表单?为什么简单地放一个链接到删除页面?
  • 是的,我知道我想我会这样做,但我真的不明白为什么仅仅通过禁用 CSRF 保护它就不起作用。感谢您的帮助

标签: php symfony csrf symfony-3.3


【解决方案1】:

所以我终于想通了... 该表单未提交,因为它不包含任何字段。我调试了 $request->request->all() 方法来检查它的内容,我用 CRSF 得到了这个:

array(2) {
  ["_method"]=>
  string(6) "DELETE"
  ["form"]=>
  array(1) {
    ["_token"]=>
    string(43) "ENi9OFbTVfkJO8IFzahXUGOXe79tamHy3m04vgd7ZbM"
  }
}

没有它:

array(1) {
  ["_method"]=>
  string(6) "DELETE"
}

然后在文件HttpFoundationRequestHandler.php中,下面的代码什么都不返回(变量$name等于“form”)。

if ('' === $name) {
    $params = $request->request->all();
    $files = $request->files->all();
} elseif ($request->request->has($name) || $request->files->has($name)) {
    $default = $form->getConfig()->getCompound() ? array() : null;
    $params = $request->request->get($name, $default);
    $files = $request->files->get($name, $default);
} else {
    // Don't submit the form if it is not present in the request
    return;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-18
    • 2012-08-21
    • 2013-04-12
    • 1970-01-01
    • 2018-11-03
    • 1970-01-01
    • 1970-01-01
    • 2014-04-13
    相关资源
    最近更新 更多