slim 4 在 php 7.3 上需手动配置 json 支持:注册中间件统一设 content-type、解析 application/json 请求体、重写 notfoundhandler 和 errorhandler 返回 json,路由参数需正则约束或 filter_var 校验,避免字符串隐式转换风险。

Slim 4 在 PHP 7.3 上能跑,但必须手动补全 JSON 响应链路——它不自动设 Content-Type,不自动解析 application/json 请求体,也不统一错误格式,直接写 $response->withJson() 会出错或返回纯文本。
怎么初始化 Slim 4 并让所有响应默认是 JSON
不能只 new 一个 App 就完事。Slim 4 默认响应是 HTML,withJson() 只是快捷方法,不改头、不序列化、不设状态码,得靠中间件兜底。
- 创建
App实例后,用add()注册中间件,显式调用$response->withHeader('Content-Type', 'application/json') - 中间件里别直接
return $response,要先$handler->handle($request)再改头,否则路由逻辑不执行 - 不要在中间件里做
json_encode()——withJson()内部已处理,重复编码会导致双层 JSON 字符串 - 如果用了 Laminas Diactoros 等 PSR-7 实现,确认你调的是 Slim 的
withJson(),不是 PSR 标准里不存在的方法
路由参数怎么取、怎么防类型翻车
$request->getAttribute('id') 拿到的永远是字符串,哪怕 URL 是 /users/123。PHP 7.3 不支持属性类型声明(如 int $id),框架也不 cast,直接丢进 SQL 或比较会出问题。
- 别信
$args['id']是整数——它和getAttribute()一样,只是字符串 - 正则约束最省心:
$app->get('/users/{id:[0-9]+}', ...),URL 里带字母直接 404,不进路由逻辑 - 需要宽松校验时,用
filter_var($id, FILTER_VALIDATE_INT),注意0和false都是 valid,得额外判!== false - 强转
(int)$id有风险:字符串"123abc"变成123,静默截断,不如正则硬拦
POST 的 JSON 数据怎么安全读取
$request->getParsedBody() 在 PHP 7.3 + Slim 4 下对 application/json 默认不生效——它只认 x-www-form-urlencoded 和 multipart。直接读 getBody() 拿到的是 stream resource,不是数组。
- 手动解析:
json_decode($request->getBody()->getContents(), true) - 必须检查
json_last_error() === JSON_ERROR_NONE,否则空体、乱码、BOM 头都会让结果为null,后续调用array_key_exists()就报 Warning - 建议封装成中间件:检测
Content-Type: application/json,成功解析后挂到$request->withAttribute('json', $data),路由里直接取 - 别用
file_get_contents('php://input')—— Slim 的 PSR-7 实现可能已消费流,再读就是空
为什么 404 和异常还是返回 HTML
Slim 4 自带的 notFoundHandler 和 errorHandler 输出的是 HTML 片段,前端 fetch().then(r => r.json()) 会崩在解析阶段。
- 必须重写这两个处理器:在
App构造时传入'notFoundHandler'和'errorHandler'配置项 - 返回值必须是
$response->withStatus(404)->withJson(['message' => 'Not Found']),不能只echo json_encode() - 自定义
errorHandler里别暴露getMessage()给生产环境——PHP 7.3 的错误信息可能含路径、变量名等敏感内容 - 注意:
errorHandler不捕获ParseError(如语法错误),这类错误仍走 PHP 默认错误页,得靠 web server 日志或display_errors = Off控制
PHP 7.3 已 EOL,但 Slim 4 支持它;真正容易被忽略的点是:所有 JSON 相关操作都依赖你主动控制流——没中间件,withJson() 白写;没正则约束,{id} 就是字符串;没手动解析,POST /json 永远拿不到数组。每一步都得亲手拧紧。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











