2011-11-25 43 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