You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Slim PHP:PHPUnit测试中Authorization Header无法被代码识别

问题

基于Slim PHP框架开发,通过中间件引入PHP包作为服务/控制器,在PHPUnit测试中传递Authorization Header时遇到异常:打印$_SERVER数组时该Header不存在,业务代码无法获取到它。

测试代码如下:

$param1 = "param1";
$param2 = "param2";
$param3 = "param3";

$env = Environment::mock(array(
    'REQUEST_METHOD' => 'POST',
    'REQUEST_URI' => '/v1/url/to/api',
    'CONTENT_TYPE' => 'application/json',
    'HTTP_AUTHORIZATION' => 'Bearer ' . $this->token,
));

$attributes = [
    $param1 => "100",
    $param2 => "0",
    $param3 => "1000",
];

$req = Request::createFromEnvironment($env)->withParsedBody($attributes);
$this->app->getContainer()['request'] = $req;
$response = $this->app->run(true);

$this->assertSame($response->getStatusCode(), 200);
$result = json_decode($response->getBody(), true);
$this->assertIsArray($result["content"]);

补充说明:原本以为Environment是测试用的模拟环境,但测试会向数据库插入数据,却仍无法让代码识别到测试中的Authorization Header。

解决方案

1. 直接给Request对象绑定Authorization Header

仅通过Environment设置Header可能存在同步问题,直接在生成Request后显式添加Header:

$req = Request::createFromEnvironment($env)
    ->withParsedBody($attributes)
    ->withHeader('Authorization', 'Bearer ' . $this->token);

2. 修正容器中Request的注入方式

不要直接赋值容器的request项,改用Slim推荐的依赖注入方式绑定测试请求,确保中间件和控制器能正确获取到带Header的请求实例。

3. 业务代码改用Request对象获取Header

停止直接读取$_SERVER['HTTP_AUTHORIZATION'],改用Slim封装的Request方法获取,这是框架标准用法,能保证测试与生产环境行为一致:

// 获取完整Authorization Header
$authHeader = $request->getHeaderLine('Authorization');

// 提取Bearer Token
$token = $request->getHeaderLine('Authorization');
if (str_starts_with($token, 'Bearer ')) {
    $token = substr($token, 7);
}

4. 检查测试的App初始化逻辑

既然测试会操作真实数据库,说明未使用模拟数据源,此时需确保测试前容器已被重置,避免之前的请求实例残留影响当前测试的Header读取。

内容的提问来源于stack exchange,提问作者Jigga Byte

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 17:25:28