Форма Symfony2 с CSRF прошла через 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. В другом случае я извлекаю сообщения об ошибках и получаю:

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

Символ CSRF передается по почте так же, как если бы форма была отправлена ​​синхронно.

Другая возможная проблема. Уникальный идентификатор формы

Форма, которую я использую, создается классом типа формы. На любой заданной странице будет несколько форм комментариев. Поскольку symfony2 использует метод getName() класса type для заполнения атрибута идентификатора формы, я изменил его так:

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

Это позволяет создавать несколько форм комментариев без одного и того же идентификатора, например. обсуждениеForm20, обсуждениеForm21, обсуждениеForm22 и т.д.

Я мог удалить компонент symfony2 Form из состава и сгенерировать форму/процесс представления с использованием стандартной PHP-логики, но пока я сопротивляюсь этому.

Кто-нибудь знает, почему теги CSRF недействительны? Любые предложения о том, как это можно изменить или как вы это делаете?

Ответы

Ответ 1

Попробуйте с адекватной функцией JQuery: submit() ^^ В моем решении я полагаю, что ваша форма имеет идентификатор "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 отправляется!

И не забудьте добавить твиг-тег {{form_rest (form)}} в шаблон формы, который будет генерировать все скрытое поле, такое как CSRF.