Slim 4 初始化需手动配置JSON响应:创建App实例后添加中间件设置Content-Type为application/json,路由中显式调用withJson();路由参数默认字符串需正则约束或手动类型转换;JSON请求体须手动解析;404/错误处理器需重写返回JSON。

怎么初始化 Slim 4 实例并启用 JSON 响应
Slim 4 不再自动处理 JSON,必须手动配置响应头和序列化逻辑。否则 $response->withJson() 会返回纯文本或触发 Content-Type 冲突。
- 创建实例后,用
add()注册中间件设置默认Content-Type: application/json - 务必在路由回调里显式调用
$response->withJson($data),不能只echo json_encode(...) - 如果用了 PSR-7 响应对象(比如 Laminas Diactoros),注意
withJson()是 Slim 自带方法,不是 PSR 标准接口
$app = new \Slim\App();
$app->add(function ($request, $handler) {
$response = $handler->handle($request);
return $response->withHeader('Content-Type', 'application/json');
});
路由参数怎么取、怎么校验类型
Slim 的路由变量默认是字符串,$request->getAttribute('id') 拿到的永远是 string,哪怕 URL 里写的是 /users/123 —— 这点容易导致数据库查询出错或类型判断失效。
- 用
filter_var($id, FILTER_VALIDATE_INT)或强转(int)$id,但要注意0和false边界情况 - 更稳妥的做法是在路由定义时加正则约束:
$app->get('/users/{id:[0-9]+}', ...) - 不要依赖框架自动转换,Slim 不做隐式类型 cast,也不报类型警告
怎么处理 POST 的 JSON 请求体
直接读 $request->getBody() 得到的是流资源,不是已解析的数组;$request->getParsedBody() 对 JSON 默认不生效 —— 因为 Slim 只解析 application/x-www-form-urlencoded 和 multipart/form-data。
- 必须手动解析:用
json_decode($request->getBody()->getContents(), true) - 记得检查
json_last_error() === JSON_ERROR_NONE,否则空体或格式错误会静默返回null - 可以注册一个解析中间件,统一处理
Content-Type: application/json的请求,把结果挂到$request属性上
为什么 404 错误不返回 JSON 而是 HTML
Slim 默认的 Not Found 处理器输出的是 HTML 片段,和你的 API 返回格式不一致,前端拿到非 JSON 响应就容易崩解码逻辑。
立即学习“PHP免费学习笔记(深入)”;
- 必须重写
notFoundHandler:在App配置里传入自定义闭包,返回$response->withStatus(404)->withJson([...]) - 同理,
errorHandler也要重写,否则未捕获异常会打出堆栈 HTML - 别漏掉
phpErrorHandler—— PHP 解析错误(如语法错)走的是它,不是errorHandler



















