Flight路由需显式指定HTTP方法,@id参数须用正则约束,响应必须调用Flight::json()或手动header()+echo,分组必须在Flight::start()前定义。
Flight 的路由和响应机制本身极轻,但容易因“写法顺序”和“返回值误用”直接导致 404、空白页或 header 冲突——不是框架不行,是它不帮你兜底。
Flight::route() 必须带明确 HTTP 方法前缀
Flight 不默认绑定 GET;不加方法名,路由就只匹配所有方法(包括 OPTIONS、HEAD),但多数 Web 服务器或前端发请求时不会触发你预期的回调。
✅ 正确写法:
、
❌ 错误写法:
—— 看似省事,实则匹配逻辑模糊,调试时难定位
⚠️ 注意:
是合法的,但若需区分逻辑,建议拆成两个路由,避免回调里堆 if($_SERVER['REQUEST_METHOD'] === 'POST')
参数路由里的
不自动解析,正则约束得手写
Flight 的
只是占位符替换,不校验类型或格式。比如
会把
也传进去,$id = 'abc',后续出错才暴露问题。
✅ 安全做法:用正则显式约束,如
✅ 更灵活写法:
(适合简单场景)
⚠️ 别依赖
提取参数——它返回的是去除域名后的完整路径,
就是原样返回,不帮你切分
响应必须用
或手动
+
,不能 return
Flight 不捕获路由回调的 return 值,写了也丢弃。常见错误是写
,结果页面空白——因为没输出、没设 header。
立即学习
“
PHP免费学习笔记(深入)
”;
✅ 返回 JSON:
—— 自动设
和
✅ 自定义状态码:
✅ 返回纯文本或 HTML:
⚠️ 切忌混用:
后再调
会触发 “headers already sent” 错误
路由分组
必须在
前定义
这是最隐蔽的坑:分组不是运行时行为,而是静态注册阶段拼接前缀。一旦
执行,路由表就冻结了。
✅ 正确顺序:
❌ 无效写法:把
放在
后面,或包在某个条件判断里
⚠️ 分组不支持链式调用:
会报错;只能嵌套闭包:
⚠️ 子路由开头的
可省可不省:
和
在
下都等价于
真正卡住人的地方,往往不是语法写错,而是执行时机错——比如
放错位置、
当成有效输出、或者以为
天然带数字校验。这些点不试一次,光看文档很难意识到。
Flight::route('GET /users', function() { ... });Flight::route('POST /users', function() { ... });Flight::route('/users', function() { ... });GET|POST /login@id@id/user/@id/user/abcFlight::route('GET /user/@id:[0-9]+', function($id) { ... });Flight::route('GET /user/[0-9]+', function() { $id = (int)basename(Flight::request()->url); ... });Flight::path()/v1/user/123Flight::json()header()echoreturn ['data' => 'ok'];Flight::json(['status' => 'success']);Content-Type: application/json200 OKFlight::response()->status(404); Flight::json(['error' => 'not found']);header('Content-Type: text/plain'); echo 'done';Flight::json(...)header()Flight::group()Flight::start()Flight::start()Flight::group('/api', function() { Flight::route('GET /users', ...); }); Flight::start();Flight::group(...)Flight::start()Flight::group('/v1')->group('/users')Flight::group('/v1', function() { Flight::group('/users', function() { ... }); });/route('GET /list')route('GET list')group('/api')/api/listgroup()return@id