group() 必须在 flight::start() 前调用,否则路由不生效;它按闭包执行顺序线性拼接前缀,不支持深层自动合并,且不返回 router 实例,不可链式调用。

Flight PHP 中 group() 的正确调用时机
必须在 Flight::start() 之前定义分组,否则路由完全不生效——这是最常被忽略的执行顺序问题。Flight 的路由注册是静态构建过程,start() 一执行,内部路由表就冻结了。
- ✅ 正确:先
Flight::group('/api', function() { ... });,再Flight::start() - ❌ 错误:把
group()放在start()后面,或放在某个响应处理函数里 - ⚠️ 注意:
group()本身不返回 Router 实例,不能链式调用;它只是把闭包里的子路由前缀自动拼接
嵌套 group() 时的路径拼接规则
Flight 不支持“深层嵌套自动合并”,而是按闭包执行顺序线性拼接前缀。比如外层 group('/v1') 里再调 group('/users'),最终路径是 /v1/users/xxx,但前提是内层 group() 必须写在闭包体内。
- ✅ 有效:
Flight::group('/v1', function() { Flight::group('/users', function() { Flight::route('GET /list', function() { ... }); }); });生成路由:GET /v1/users/list - ❌ 无效:把第二个
group()拿到外面,和第一个平级,就不会叠加 - ⚠️ 路径开头的
/很关键:子group('/users')和group('users')效果一样;但route('GET /list')和route('GET list')在分组下等价,而route('GET /v1/list')会破坏分组逻辑
分组内如何访问原始请求路径(避免硬编码前缀)
Flight 不提供类似 Laravel 的 $request->getBaseUrl(),分组后你拿到的 Flight::request()->url 仍是完整 URL 路径(如 /v1/users/list),但业务逻辑里不该依赖这个做判断——容易和分组配置脱节。
- ✅ 推荐:用
Flight::path()获取当前匹配到的**路由模式字符串**(如/v1/users/list),它已扣除分组前缀并标准化 - ❌ 避免:手动
str_replace('/v1', '', $url)—— 一旦改分组前缀就得全局搜替换 - ⚠️ 注意:
Flight::path()在未匹配路由时返回空字符串,需判空;且它不包含查询参数
为什么 group() 里不能直接用 Flight::route() 定义非 HTTP 方法路由
可以,但容易踩坑:Flight 的 route() 默认只处理 GET 和 POST,其他方法(PUT、DELETE 等)需显式声明,且大小写敏感。分组不会改变这个行为。
- ✅ 正确写法:
Flight::route('DELETE /item/@id', function($id) { ... }); - ❌ 常见错误:
Flight::route('delete /item/@id', ...)(小写方法名不识别) - ⚠️ 兼容性注意:某些服务器(如旧版 Apache)默认不转发
PUT/DELETE,需靠_METHOD参数模拟,此时 Flight 不自动解析,得自己从$_POST['_METHOD']提取并重写路由逻辑
require,或者用 set() 注入共享服务,而不是指望 group() 自带作用域隔离。php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











