PHPUnit - getallheaders не работают

Я тестирую свой код, и у меня есть проблема с заголовком. В каждом api я использую

$headers = getallheaders();

чтобы это получить, и это отлично работает, когда я тестирую приложение или постмодернистское устройство crhome. Когда я лауч мой тест, как этот

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

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

где я пытаюсь снять карту с этим qrcode с пользователем с этим токеном теста (не токеном, который я буду использовать в приложении), я вижу такой вызов здесь: qaru.site/info/306034/.... Тест завершился неудачно:

PHP Неустранимая ошибка: вызов функции undefined AppBackendBundle\Controller\getallheaders() в /var/www/pitstop/src/AppBackendBundle/Controller/ApiController.php в строке 42

Ответ 1

Из этой статьи:

Если вы используете Nginx, PHP-FPM или любой другой метод FastCGI для запуска PHP, вы, вероятно, заметили, что функция getallheaders() не существует. Есть много творческих обходных путей, но PHP предлагает две очень полезные функции, чтобы облегчить вашу боль.

От комментариев пользователей в функции getallheaders() руководства по PHP от joyview на gmail dot com

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;
    }
}

Ответ 2

i разрешается таким образом (благодаря fooobar.com/questions/306034/...)

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

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

поэтому нормальный запрос от приложения получает заголовок с getallheaders(), запрос из PHPUnit получает его из объекта Request. Я не знаю, почему (если кто-то может объяснить), но работает.

Ответ 3

Небольшое отличие от кода @Matteos, который удаляет Mod-Rewrite и добавляет Content-Length и Content-Type, которые обычно возвращаются getallheaders(). Интересно, что случай с ключами массива, возвращаемыми 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;
    }
}