Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/85.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过JQuery AJAX传递带有CSRF的Symfony2表单_Jquery_Ajax_Symfony_Csrf - Fatal编程技术网

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

通过JQuery AJAX传递带有CSRF的Symfony2表单,jquery,ajax,symfony,csrf,Jquery,Ajax,Symfony,Csrf,我正在开发一个注释框,它将通过jqueryajax调用保存注释 JQuery 以下是JQuery代码(这可以无缝工作): Symfony2控制器 然后,Symfony2控制器方法拾取表单数据并对其进行处理。作为该过程的一部分,它会检查表单是否有效: $entry = new Discussion(); $discussionForm = $this->createForm(new DiscussionType(), $entry); if ($request->getMethod(

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

JQuery

以下是JQuery代码(这可以无缝工作):

Symfony2控制器

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

$entry = new Discussion();
$discussionForm = $this->createForm(new DiscussionType(), $entry);

if ($request->getMethod() == 'POST') {

    $discussionForm->bindRequest($request);

    if ($discussionForm->isValid()) {
此检查未返回真值。在else中,我提取已给出的错误消息并获取:

Array
(
    [0] => The CSRF token is invalid. Please try to resubmit the form
)
CSRF令牌通过post传递,就像同步提交表单一样

另一个可能的问题。。唯一的表单Id

我使用的表单是由表单类型类创建的。在任何给定的页面上都会有多个评论表单。由于symfony2使用type类的getName()方法填充forms ID属性,因此我对其进行了如下修改:

public function getName()
{
    return 'discussionForm' . $randomNumber;
}
这允许使用多个没有相同id的评论表单,例如discussionForm20、discussionForm21、discussionForm22等

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


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

尝试使用适当的JQuery函数:submit()^^^^在我的解决方案中,我假设您的表单id为“comment\u 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字段


不要忘记在表单模板中添加细枝标记{{form_rest(form)}},这将生成所有隐藏字段,如CSRF。

JQuery submit方法在这里并不重要。它的工作原理是$.ajax调用采用数据参数中序列化的所有表单数据。
$('#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;

});