发生事情的经过:在开发中新增/修改了接口,再三确认了接口路由和访问路径后尝试访问结果404,折腾半天,以为是缓存、进程没有加载拉取到最新的代码就尝试了各种重启,以及重启服务器,结果还是没用....
不死心!在AI的配合下逐个执行命令去服务器终端上对比排查,最后得出的结论是因为route/下面多余放了其它文件“副本api.php”.......
通过证实,删除了route/目录下的多余副本文件,然后接口就通了.........
继续追问AI后得到的解释:
ThinkPHP 6 从来没打算"只认 api.php"
它是刻意设计成"route/ 下所有 .php 全加载"的,为的是支持多路由文件拆分——CRMEB光路由文件就有 api.php(小程序端)、admin.php(后台)、store.php(门店)、supplier.php(供应商)、cashier.php(收银)等七八个,启动时全部 include 才组成完整路由表。框架的约定是:放进 route/ 目录、后缀 .php → 就是正式路由定义,照单全收。
它没有能力、也不会去判断"这个文件是不是备份"。你把备份放进去了,它就当正式路由执行。
那为什么 api.php 不"优先"?
因为在框架眼里两个文件地位完全平等,没有主次之分,谁先被 glob 扫到谁先注册。-(0x2D) 排在 .(0x2E) 前面,副本反而比 api.php 更早注册。但就算顺序反过来,同名冲突依然存在——所以问题的本质从来不是"顺序/权重",而是多出来一个文件多注册了一套规则。
一句话总结
不是副本抢了 api.php 的权重,而是框架"照单全收",把副本里的旧规则和正式规则当成了两套并存的路由,同名冲突导致新接口匹配不上。备份文件只要不放在 route/(或改成 .txt),就永远不会有这种事。
以上仅分享一下记录过程,AI给到的解释如有不对 官方可以纠正.......

