2011-11-25 7 views
6

Ho una situazione in uno dei miei controller a cui si può accedere solo tramite AJAX, ho il seguente codice.Ottieni ambiente all'interno del controller

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

Durante il test, questo mi dà un problema perché la richiesta non è stata effettivamente effettuata tramite AJAX. Questo poi rompe i miei test ogni volta. Come dovrei andare a lavorare su questo?

mie idee:

  1. ho cercato di impostare un colpo di testa server, ma hanno avuto alcun successo.
  2. Controllare se sono nell'ambiente di test nel controller e non eseguire il controllo se lo è. So che è sporco, ma funzionerebbe. : -/Il problema era che non riuscivo a capire come scoprire in che ambiente mi trovo.

Qualcun altro ha altre idee o suggerimenti che mi mancano per ottenere uno dei suddetti a lavorare?

+1

come hai impostato intestazione nei test ? – meze

+0

Vedere il mio commento sulla risposta accettata. – Icode4food

risposta

5

Guardando il codice per isXmlHttpRequest in classe Request e il metodo getHeaders in classe ServerBag, il pezzo di codice qui sotto dovrebbe fare il trucco:

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

non ho la prova in prima persona, ma penso che dovrebbe lavori. La riga di codice riportata di seguito in Request viene utilizzata per verificare se la richiesta http è una XmlHttpRequest.

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

Nel codice, $this->headers è impostato utilizzando:

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

Procedimento getHeaders crea un array di intestazioni. Ogni variabile del server che inizia con HTTP_, più alcune variabili del server speciali come CONTENT_TYPE, vengono inserite in questo array.

Spero che questo aiuti.

saluti,
Matt

+0

Hai colto il problema in testa. Stavo impostando l'intestazione come 'X-Requested-With' invece che con il prefisso' HTTP_'. Pensavo di averlo provato ma ... credo di no. Grazie. – Icode4food

8

Naturalmente nel caso di Icode4food, è meglio da usare la soluzione di Matt, ma qui è come trovare il contesto attuale:

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

non dovrebbe essere $ container-> getParameter ('kernel.environment') ;? –

+0

@ TroodoN-Mike - sì, è stato modificato. fisso. – dvb

Problemi correlati