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