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