Estoy desarrollando un cuadro de comentarios que guardará el comentario a través de una llamada JQuery AJAX.Formulario Symfony2 con CSRF pasado a través de JQuery AJAX
JQuery
Aquí está el código JQuery para que (esto funciona sin problemas):
$(".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;
});
Controller Symfony2
El método controlador Symfony2 continuación, recoge los datos y procesos de formulario eso. Como parte de ese proceso, comprueba si el formulario es válido:
$entry = new Discussion();
$discussionForm = $this->createForm(new DiscussionType(), $entry);
if ($request->getMethod() == 'POST') {
$discussionForm->bindRequest($request);
if ($discussionForm->isValid()) {
Esta comprobación no se cumple. En el otro extraigo lo que los mensajes de error se les ha dado y obtener:
Array
(
[0] => The CSRF token is invalid. Please try to resubmit the form
)
El token CSRF se está pasando a través de correo tal como lo haría si el formulario se ha enviado de forma sincrónica.
Otro posible problema .. Formulario de identificación únicos
La forma estoy usando es creado por una clase de tipo de formulario. En cualquier página dada, habrá varios formularios de comentarios. Como Symfony2 utiliza el método getName() de la clase tipo para poblar el atributo formas ID, he modificado así:
public function getName()
{
return 'discussionForm' . $randomNumber;
}
Esto permite que varios comentarios formas sin el mismo ID, por ejemplo, discussionForm20, discussionForm21, discussionForm22 etc.
Podría eliminar el componente de formulario symfony2 de la mezcla y generar el formulario/procesar la presentación usando la lógica PHP estándar, pero me resisto a eso por ahora.
¿Alguien sabe por qué el token CSRF de formularios no es válido? ¿Alguna sugerencia sobre cómo esto podría ser modificado o cómo lo haces?
el método de envío JQuery no es importante aquí. Lo que hace que funcione es que la llamada $ .ajax toma todos los datos de forma serializada en el parámetro de datos. –