在控制器内获取环境

6

我在一个控制器中遇到了一个只能通过 AJAX 访问的情况,以下是我的代码。

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

当我进行测试时,出现了问题,因为请求实际上并没有通过AJAX发出。这使得我的测试每次都失败。我该如何解决这个问题?
我的想法:
  1. 我尝试设置服务器标头,但完全没有成功。
  2. 在控制器中检查是否处于测试环境,如果是,则不进行检查。我知道这很粗糙,但它会起作用。 :-/ 问题是我无法弄清楚我处于哪个环境。
还有其他人有任何其他想法或提示吗?我错过了什么,以使上述方法之一能够起作用吗?

1
你是如何在测试中设置头部的? - meze
请查看我对被接受答案的评论。 - Icode4food
2个回答

8
当然,在Icode4food的情况下,最好使用Matt的解决方案,但以下是如何找到当前环境:
$this->container->getParameter(‘kernel.environment’)

不应该是$container->getParameter('kernel.environment');吗? - TroodoN-Mike
@TroodoN-Mike - 是的,它已经被更改了。已修复。 - Dvir Berebi

5

查看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,都会被放在这个数组中。
希望对你有所帮助。
祝好,
Matt

你说得对。我将头部设置为 X-Requested-With 而不是带有 HTTP_ 前缀。我以为我已经尝试过了,但是...我猜没有。谢谢。 - Icode4food

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接