必须显式创建Klein实例并调用$klein->dispatch()才能启用路由;路径参数通过闭包参数获取,query string用$request->paramsGet();POST需明确定义method;$response->json()后须return防止响应污染。

怎么注册 Klein 路由实例并启动监听
Klein 不是 Laravel 那种全自动框架,它本身不接管整个 HTTP 生命周期,你得手动触发路由匹配。常见错误是写了路由但没调用 $klein->dispatch(),结果请求始终 404。
- 必须显式创建
Klein实例(通常传入$_SERVER和$_GET) - 所有路由定义完后,一定要调用
$klein->dispatch(),否则路由不会生效 - 别把它放在
require后就不管了——它不自动运行,也不挂载到 SAPI 上
$klein = new \Klein\Klein();
$klein->respond('GET', '/api/users', function ($request, $response) {
$response->json(['users' => []]);
});
$klein->dispatch(); // 这行漏掉,路由就完全不工作
GET/POST 路由参数怎么取,路径变量和 query string 有啥区别
很多人混淆 :id 占位符和 $_GET,其实 Klein 把两者分开处理:路径参数走闭包参数,query string 还得自己读 $request->paramsGet() 或 $_GET。
- 路径参数如
/user/:id中的:id,会作为第二个参数传给回调函数($request之后),顺序固定 -
$request->paramsGet()读的是 URL 查询参数(?name=foo),不是路径里的 - POST 表单数据用
$request->paramsPost(),JSON 请求体需手动json_decode(file_get_contents('php://input'), true) - 别在闭包里直接用
$_POST——如果用了Content-Type: application/json,它就是空的
$klein->respond('GET', '/post/:id', function ($request, $response, $service, $id) {
$query = $request->paramsGet(); // ?page=2 → ['page' => '2']
$user_id = $id; // 来自 /post/123 中的 123
});
为什么 POST 路由返回 405 Method Not Allowed
这不是 Klein 的 bug,而是你没告诉它“这个路径支持 POST”。Klein 默认只响应你明确定义的 method + path 组合,不存在“fallback 到其他 method”的逻辑。
- 写
$klein->respond('POST', '/login', ...)才能响应 POST;只写GET就不认 POST - 别指望
$klein->respond('/login', ...)自动兼容所有 method——这种写法等价于只响应 GET - 如果要同一路径支持多个 method,得分别注册,或用数组语法:
$klein->respond(['GET', 'POST'], '/form', ...) - 405 错误时检查 Apache/Nginx 是否转发了原始 method(特别是反向代理场景下,有时会把 POST 改成 GET)
如何让 Klein 返回 JSON 并设 Content-Type
$response->json() 看似方便,但它内部只是 echo + header,不终止脚本。如果你后面还有输出(比如意外的空格、debug 输出),JSON 就会被破坏。
立即学习“PHP免费学习笔记(深入)”;
-
$response->json()会设置Content-Type: application/json,但不会 exit/die - 务必在
json()后加return或exit,避免后续代码污染响应体 - 如果需要自定义状态码,用
$response->code(400)->json([...]),注意顺序:先 code,再 json - 别混用
header()和$response->json()——后者已发 header,重复调用可能 warning
$klein->respond('GET', '/health', function ($request, $response) {
$response->code(200)->json(['status' => 'ok']);
return; // 必须加,否则可能多输出换行或警告
});
实际用 Klein 做小 API 时,最常卡住的地方不是语法,而是 dispatch 没调、method 没对齐、或者 json 后没 return。它轻量,但也意味着每一步都得你自己盯住。











