2011-11-25 28 views
6

Tengo una situación en uno de mis controladores a los que solo se debe acceder a través de AJAX, tengo el siguiente código.Obtener entorno dentro del controlador

if (!$request->isXmlHttpRequest()) { 
    $response = new Response(); 
    $response->setContent('AJAX requests only!'); 
    return $response; 
} 

Cuando estoy probando esto me da un problema porque la solicitud en realidad no se ha hecho a través de AJAX. Esto luego rompe mis exámenes todo el tiempo. ¿Cómo debo trabajar alrededor de esto?

mis ideas:

  1. me han tratado de establecer una cabecera servidor, pero han tenido ningún éxito.
  2. Compruebe si estoy en el entorno de prueba en el controlador y no hago la comprobación si es así. Sé que esto es sucio, pero funcionaría. : -/El problema fue que no pude encontrar la manera de descubrir en qué ambiente estoy.

¿Alguien más tiene alguna otra idea o consejo que me hace falta para hacer funcionar uno de los anteriores?

+1

¿cómo se establece de cabecera en las pruebas ? – meze

+0

Ver mi comentario sobre la respuesta aceptada. – Icode4food

Respuesta

5

Mirando el código para isXmlHttpRequest en clase Request y el método getHeaders en clase ServerBag, el trozo de código de abajo debe hacer el truco:

$client->request(
    'GET', 
    '/path/to/test', 
    array(), 
    array(), 
    array(
     'HTTP_X-Requested-With' => 'XMLHttpRequest', 
    ) 
); 

no he probado personalmente, pero creo que debería obras. La línea de código siguiente en Request se utiliza para verificar si la solicitud http es XmlHttpRequest.

return 'XMLHttpRequest' == $this->headers->get('X-Requested-With'); 

En el código, $this->headers se establece usando:

$this->headers = new HeaderBag($this->server->getHeaders()); 

El método getHeaders crea una matriz de cabeceras. Cada variable de servidor que comienza con HTTP_, más algunas variables de servidor especiales como CONTENT_TYPE, se ponen en esta matriz.

Espero que esto ayude.

Saludos,
Matt

+0

Aciertas el problema en la cabeza. Estaba configurando el encabezado como 'X-Requested-With' en lugar de con el prefijo' HTTP_'. Pensé que había intentado eso, pero ... supongo que no. Gracias. – Icode4food

8

Por supuesto, en el caso de Icode4food, es mejor utilizar la solución de Matt, pero aquí es cómo encontrar el entorno actual:

$this->container->getParameter(‘kernel.environment’) 
+0

no debería ser $ container-> getParameter ('kernel.environment') ;? –

+0

@ TroodoN-Mike - sí, ha sido cambiado. fijo. – dvb

Cuestiones relacionadas