Форма Symfony2 с CSRF прошла через JQuery AJAX - PullRequest
15 голосов
/ 25 января 2012

Я разрабатываю поле для комментариев, в котором комментарий будет сохранен с помощью вызова 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;
}

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

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

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

1 Ответ

29 голосов
/ 25 января 2012

Попробуйте использовать адекватную функцию 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.

...