PHPUnit - getallheaders不起作用

时间:2017-01-02 13:01:05

标签: api http-headers phpunit

我正在测试我的代码,我的标题有问题。在每个api我使用

$headers = getallheaders();

得到它,当我使用app或crhome邮递员扩展测试时,这工作正常。 当我试探我的测试时,就像这样

 $client = $this->createClient();
    $client->request('GET', '/api/shotcard',
        ['qrcode'=>'D0m1c173'], [],
        ['HTTP_API_TOKEN' => 'abc123']
    );

    $this->assertEquals(200, $client->getResponse()->getStatusCode());

我尝试使用带有该测试令牌的用户(不是我将在应用程序中使用的令牌)使用该qrcode拍摄卡片,我在此处看到如下呼叫:https://stackoverflow.com/a/11681422/5475228。 测试以这种方式失败:

  

PHP致命错误:在第42行的/var/www/pitstop/src/AppBackendBundle/Controller/ApiController.php中调用未定义的函数AppBackendBundle \ Controller \ getallheaders()

3 个答案:

答案 0 :(得分:26)

来自this文章:

  

如果您使用Nginx,PHP-FPM或任何其他运行PHP的FastCGI方法   你可能已经注意到函数getallheaders()没有   存在。有许多创造性的解决方法,但PHP提供   两个非常好的功能,以减轻您的痛苦。

来自joyview at gmail dot com

的PHP手册getallheaders()函数的用户贡献评论
if (!function_exists('getallheaders')) {
    function getallheaders() {
    $headers = [];
    foreach ($_SERVER as $name => $value) {
        if (substr($name, 0, 5) == 'HTTP_') {
            $headers[str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', substr($name, 5)))))] = $value;
        }
    }
    return $headers;
    }
}

答案 1 :(得分:2)

我以这种方式解决(感谢https://stackoverflow.com/a/11681422/5475228

private function request_headers($type, Request $request)
{
    if(function_exists("getallheaders"))
    {
        if($header = getallheaders()[$type])
        {
            return $header;
        }
    }

    return $request->headers->get($type);
}

所以来自app的正常请求获取带有getallheaders()的头,来自PHPUnit的请求从Request对象获取它。我不知道为什么(如果有人可以解释)但是有效。

答案 2 :(得分:0)

与@Matteos代码略有不同,它删除了Mod-Rewrite并添加了通常由getallheaders()返回的Content-Length和Content-Type。有趣的是,getallheaders()返回的数组键的情况似乎无处不在,而且不一致,而显然此版本可确保一致性。

$allHeaders = array();
foreach($_SERVER as $name => $value) {
    if($name != 'HTTP_MOD_REWRITE' && (substr($name, 0, 5) == 'HTTP_' || $name == 'CONTENT_LENGTH' || $name == 'CONTENT_TYPE')) {
        $name = str_replace(' ', '-', ucwords(strtolower(str_replace('_', ' ', str_replace('HTTP_', '', $name)))));
        $allHeaders[$name] = $value;
    }
}