PHP Slim框架ErrorHandler返回异常前端无法读取响应问题排查
问题原因
- 核心原因是错误响应缺少CORS头:你正常在控制器中返回响应时,全局CORS中间件会正常执行,给响应加上跨域 required 的头信息,浏览器可正常解析。但代码抛出异常/触发PHP错误时,请求流程会直接跳转到ErrorHandler,跳过了后续中间件执行,你在ErrorHandler中新建的响应没有附加CORS头,浏览器基于跨域安全策略直接拦截了响应内容,所以显示加载失败、JS拿到status为0的未知错误;Postman不校验跨域规则,所以能正常拿到结果。
- 次要问题:你在ErrorHandler中没有复用传入的
$response对象,而是重新从容器拉取新的响应实例,可能丢失已经设置的全局头信息。 - 额外检查:如果未注册
phpErrorHandler,PHP级别的警告、通知类错误可能无法被你的自定义逻辑捕获,也可能导致输出异常。
修复方案
1. 修改ErrorHandler,手动加CORS头、复用现有响应对象
$container['errorHandler'] = function ($c) { return function (ServerRequestInterface $request, Response $response, $exception) use ($c) { $data = [ 'message' => $exception->getMessage() ]; // 复用传入的$response,不要重新拉取新实例 return $response->withStatus(500) ->withHeader('Content-Type', 'application/json') // 按业务实际需求调整CORS头的值即可 ->withHeader('Access-Control-Allow-Origin', '*') ->withHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, OPTIONS') ->withHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization') ->write(json_encode($data)); }; };
2. 注册phpErrorHandler处理PHP级别错误
你测试时触发的Undefined array key属于PHP警告,要确保这类错误也走自定义错误逻辑,同步注册phpErrorHandler复用现有处理逻辑即可:
$container['phpErrorHandler'] = function ($c) { return $c->get('errorHandler'); };
3. 配置校验
确保php.ini中display_errors = Off,避免PHP自带的错误输出提前发送,破坏你返回的JSON格式、导致响应头异常。
内容的提问来源于stack exchange,提问作者bluray
相关产品推荐
相关产品推荐

