【问题标题】:Get environment inside controller获取控制器内部的环境
【发布时间】:2011-11-25 16:53:06
【问题描述】:

我的一个控制器出现了只能通过 AJAX 访问的情况,我有以下代码。

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

当我测试时,这给了我一个问题,因为请求实际上并没有通过 AJAX 发出。然后,这每次都会打破我的测试。我应该如何解决这个问题?

我的想法:

  1. 我尝试设置服务器标头,但绝对没有成功。
  2. 检查我是否在控制器的测试环境中,如果是,请不要检查。我知道这很脏,但它会起作用。 :-/ 问题是我不知道如何发现我所处的环境。

还有其他人有任何其他想法或提示,我缺少让上述其中一项工作吗?

【问题讨论】:

  • 你是如何在测试中设置标题的?
  • 查看我对已接受答案的评论。

标签: ajax testing controller symfony phpunit


【解决方案1】:

当然在 Icode4food 的情况下,最好使用 Matt 的解决方案,但这里是如何找到当前环境:

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

【讨论】:

  • 不应该是 $container->getParameter('kernel.environment');?
  • @TroodoN-Mike - 是的,它已经改变了。固定。
【解决方案2】:

查看Request 类中isXmlHttpRequest 的代码和ServerBag 类中getHeaders 方法,下面的代码应该可以解决问题:

$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,都放在这个数组中。

希望这会有所帮助。

问候,
马特

【讨论】:

  • 你正中问题。我将标题设置为 X-Requested-With 而不是 HTTP_ 前缀。我以为我已经尝试过了,但是……我想没有。谢谢。
猜你喜欢
  • 2016-03-19
  • 2012-04-23
  • 2010-09-22
  • 1970-01-01
  • 2021-08-10
  • 2013-01-21
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多