Форма 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()) {

Эта проверка не возвращает истину. В другом случае я извлекаю, какие сообщения об ошибках были выданы, и получаю:

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

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

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

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

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

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

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

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

15
задан mblaettermann 16 September 2012 в 01:16
поделиться