Este foro ya no está activo, así que no puedes publicar nuevas preguntas ni responder a las preguntas existentes.

Symfony 2.8: Duda con Request en envío Post AJAX

27 de abril de 2016

Buenas tardes:

Tengo una duda sobre el objeto Request.

Tengo una serie de acciones por las que voy navegando y devolviendo vistas parciales, vamos, es un formulario asistido. Cada petición la hago mediante javascript de la siguiente manera:

$.ajax({
    url: step,
    data: params,
    dataType: "json",
    method: "POST",
    success: function (data) {
        if (typeof (data) != 'undefined') {
            if (data['html'] != undefined) {
                html = data['html'];
                // acción a realizar
            }
            if (data['result'] != undefined) {
                result = data['result'];
                // acción a realizar
            }
        }
    },
    fail: function () {
        alert("error");
    },
    complete: function () {
        // acción a realizar
    }
}

En el controller tengo las acciones en plan:

public function obtenerVistaX(Request $request)
{
    $data = json_decode($request->request->get('content'), true);
    #[...]
}

El tema es que si recupero así el $request, $data se queda a null. Sin embargo, en otras peticiones AJAX sí que rellena los datos. Esto entiendo que es por la forma de realizar la petición. Para que en este caso sea capaz de leer los valores del objeto request, tengo que hacerlo de la siguiente manera:

public function obtenerVistaX(Request $request)
{
    if ($request->isXmlHttpRequest()) 
    {
        $id = $request->request->get('id');
    }
    #[...]
}

La duda concretamente es, que no tengo claro en qué casos debería usar una u otra y, si alguna ya ha sido deprecated, tanto en la versión 2.8 como en la 3.

Muchas gracias.

Saludos.


Respuestas

#1

Hola @jesusjbm,

Pienso yo que si estas llamando controladores por ajax, deberías usar el método $request->isXmlHttpRequest() esto le dice a tu controller que estas usando ajax, cuando llamas a un controlador directamente no usas el isXmlHttpRequest.

Si no estoy mal, el método isXmlHttpRequest no tiene que ver directamente con el núcleo de Symfony, por lo tanto no esta deprecated para 2.8 ni para 3.

Espero te sirva.

Saludos,

@miguelplazasr

28 abril 2016, 5:25
#2

Muchas gracias.

La verdad es que me estaba haciendo un comportamiento muy extraño y ya he detectado el problema y es cómo estaba generado los parámetros en javascript para el envío. Tengo un método que gestiona la petición, pero en función de cómo 'actuase' con la vista para pasar a la siguiente, checkbox, radio, botón, ..., estaba generando los parámetros de una manera u otra y eso estaba muy feo y no le estaba gustando a Symfony ;)

Aún así, tendré que investigar más acerca del objeto Request que creo que lo he subestimado.

Un saludo.

@jesusjbm

28 abril 2016, 10:13
#3

Hola, el problema surge en la forma en la que se envían los datos por ajax, le estás indicando que lo envíe en formato json, y este tipo de formaro no carga las variables superglobales de php ni carga las variables del request.

Algunas soluciones serían:

Basicamente la idea es que cuando el formato de envío es json ('Content-Type: application/json') la data enviada solo está disponible en php usando file_get_contents('php://input') (más otras alternativas), y usando el Request de symfony con $request->getContent().

Entonces los fix que se encuentran en internet son decodificar esos datos en formato json del cuerpo de la petición y pasarlos al objeto $request->request de symfony, con la finalidad de hacer transparente para los controladores si la petición envió los datos en el formato normal o los envió en formato json.

Con respecto a métodos deprecados, no tengo conocimiento de que se haya deprecado nada del request en cuanto a la forma de saber si una petición en ajax o no.

Saludos!

@manuel_j555

28 abril 2016, 15:14
#4

Muchas gracias @manuel_j555

Al final, controlando la forma de construir en el js los parámetros, vamos, el objeto JSON, resuelve el problema, ya que ya symfony es capaz de interpretar la petición correctamente. Ahora me recupera los parámetros correctamente con:

if ($request->isXmlHttpRequest()) 
{
    $id = $request->request->get('id');
}

Para ello, he controlado en el JS la formación del objeto JSON y lo hago de la siguiente manera:

var params = {};
params['id'] = 1;

Este en concreto es un proyecto que no le puedo dedicar mucho más de 2 horas a la semana (con suerte) y es una Intranet para una clínica pequeña, así que llevo con ello más de un año y hay detalles que se me van escapando u olvidando.

Como comentaba en un mensaje previo, según el evento que lanzase la petición, formaba el objeto JSON de una manera u otra, supongo que por el momento en que me pillase. Hice de una pasada la navegación por el formulario en cliente y, ahora que estaba con la parte de guardado, revisando los datos enviados, es cuando me ha cantado el problema.

Para que nadie haga nunca eso tan feo que decía, lo pongo por aquí. Aunque sí se puede leer en el controlador los parámetros enviados, symfony no lo parsea dentro del objeto Request como json, así que hay que recuperarlo por otra vía. Con el cambio, he incluido coherencia y unificado la generación de parámetros ;)

LO QUE NO HAY QUE HACER SI NO QUIERES QUEBRADEROS DE CABEZA

var params = '{';
params += '"id" : ' + 1;
params += '}';

Saludos.

@jesusjbm

28 abril 2016, 16:39
#5

Hola @jesusjbm,

Yo solucioné ese problema con el FOSJsRoutingBundle

Mira esta pregunta en este mismo foro

Espero te sirva.

@miguelplazasr

28 abril 2016, 17:38
#6

Muchas gracias @miguelplazasr.

He echado un vistazo a la pregunta del foro y la verdad que es bastante interesante.

Un saludo.

@jesusjbm

28 abril 2016, 18:54