带有CSRF的Symfony2表单通过JQuery AJAX传递

我正在开发一个注释框,它将通过JQuery AJAX调用保存注释。

JQuery的

这是JQuery代码(这无缝地工作):

$(".post-comment").click(function() { var $form = $(this).closest("form"); if($form) { $.ajax({ type: "POST", url: Routing.generate('discussion_create'), data: $form.serialize(), cache: false, success: function(html){ alert("Success!"); // Output something } }); } else { alert("An error occured"); } return false; }); 

Symfony2控制器

然后,Symfony2控制器方法获取表单数据并对其进行处理。 作为该过程的一部分,它会检查表单是否有效:

 $entry = new Discussion(); $discussionForm = $this->createForm(new DiscussionType(), $entry); if ($request->getMethod() == 'POST') { $discussionForm->bindRequest($request); if ($discussionForm->isValid()) { 

此检查未返回true。 在else中我提取了已经给出的错误消息并得到:

 Array ( [0] => The CSRF token is invalid. Please try to resubmit the form ) 

CSRF令牌正在通过post传递,就像同步提交表单一样。

另一个可能的问题..独特的表格ID

我使用的表单是由表单类型类创建的。 在任何给定页面上都会有几个评论表格。 由于symfony2使用类型类的getName()方法来填充表单ID属性,所以我修改了它,如下所示:

 public function getName() { return 'discussionForm' . $randomNumber; } 

这允许多个注释表单没有相同的id,例如discussionForm20,discussionForm21,discussionForm22等。

我可以从混合中删除symfony2 Form组件,并使用标准PHP逻辑生成表单/处理提交,但我暂时拒绝这样做。

有谁知道为什么表单CSRF令牌无效? 关于如何修改或如何修改的任何建议?

尝试使用足够的JQuery函数:submit()^^在我的解决方案中,我认为您的表单具有id“comment_form”。 适用于我所有的sf2项目:

 $('#comment_form').submit(function(e) { var url = $(this).attr("action"); $.ajax({ type: "POST", url: url, // Or your url generator like Routing.generate('discussion_create') data: $(this).serialize(), dataType: "html", success: function(msg){ alert("Success!"); } }); return false; }); 

通常会发送CSRF字段!

并且不要忘记在表单模板中添加twig标记{{form_rest(form)}},这将生成CSRF之类的所有隐藏字段。