我正在测试我的代码,我的标题有问题。在每个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()
答案 0 :(得分:26)
来自this文章:
的PHP手册如果您使用Nginx,PHP-FPM或任何其他运行PHP的FastCGI方法 你可能已经注意到函数
getallheaders()
没有 存在。有许多创造性的解决方法,但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;
}
}