2011-11-25 64 views
6

我的一個控制器只能通過AJAX訪問,我有以下代碼。獲取控制器內部環境

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

當我測試這給了我一個問題,因爲該請求實際上尚未通過AJAX做。然後每次都會打破我的測試。我應該如何解決這個問題?

我的想法:

  1. 我已經嘗試設置服務器頭,但也絕對沒有成功。
  2. 檢查我是否處於控制器的測試環境中,並且不檢查它是否存在。我知道這很髒,但它會起作用。 : - /問題是,我無法弄清楚如何發現我所處的環境。

其他任何人有任何其他的想法或提示,我失蹤,以獲得上述工作之一?

+1

你怎麼會在你的測試設置頁眉? – meze

+0

請參閱我對已接受答案的評論。 – Icode4food

回答

5

在代碼Request類和方法getHeadersServerBag類尋找isXmlHttpRequest,這塊下面的代碼應該做的伎倆:

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

我並沒有親自測試,但我認爲它應該工作。下面的代碼行Request用於檢查http請求是否爲XmlHttpRequest

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

在代碼中,$this->headers使用設置:

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

方法getHeaders創建報頭的陣列。每個服務器變量以HTTP_開頭,再加上一些特殊的服務器變量,如CONTENT_TYPE,放在這個數組中。

希望這會有所幫助。

問候,
馬特

+0

你遇到了這個問題。我將頭部設置爲「X-Requested-With」而不是「HTTP_」前綴。我以爲我嘗試過,但是......我猜不是。謝謝。 – Icode4food

8

當然在Icode4food的情況下,最好使用馬特的解決方案,但在這裏是如何找到當前的環境:

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

不應該是$ container-> getParameter('kernel.environment');? –

+0

@ TroodoN-Mike - 是的,它已被更改。固定。 – dvb