ThinkPHP 6.1 路由调度需从 route/app.php 入口开始,确保 Web 与 CLI 路由分离;必须启用 'default_route'=>'index/index',执行 php think route:list 验证加载,用 Route::group 统一前缀,中间件须完整命名空间并显式 return $next($request),注解路由需开启 route_annotation 并严格匹配 controller_path。

ThinkPHP 6.1 路由调度流程配置需从入口路由文件开始,明确区分 Web 请求与 CLI 命令的调度路径,确保路由定义、分组、中间件绑定和参数注入全部按框架运行时顺序生效,漏掉任意一环都会导致路由不匹配或控制器无法实例化。
确认路由入口与加载时机
打开项目根目录下的 route/app.php 文件——这是 Web 请求唯一默认路由入口;CLI 命令路由则走 route/console.php,两者互不干扰。若该文件为空或被重命名,框架将回退到隐式路由(/index/index),但所有显式定义的路由均失效。
检查 config/route.php 中 【'default_route' => 'index/index'】 是否保留,默认值不可删,否则未匹配路由会抛出 RouteNotFoundException 而非跳转首页。
执行 php think route:list 查看当前已注册路由表,若输出为空,说明 route/app.php 未被正确加载或存在语法错误,此时应先修复 PHP 语法再继续。
立即学习“PHP免费学习笔记(深入)”;
定义基础路由与分组策略
在 route/app.php 中直接写:Route::get('hello', 'Index/hello'); 即可绑定 GET 请求到 app/controller/Index.php 的 hello 方法。注意控制器类名必须首字母大写,方法名小写,且类中不能有 __construct() 无参构造以外的初始化逻辑——否则路由调度时实例化失败。
批量接口统一前缀用 Route::group():Route::group('api/v1', function () { Route::get('user', 'v1.User/get'); }); 这样生成的完整路由是 【/api/v1/user】,不是 /v1/user 或 /api/user;前缀字符串必须手动拼写,框架不会自动补斜杠。
不要在分组闭包内再调用 Route::domain() 或嵌套另一个 Route::group('xxx'),TP6.1+ 明确禁止域名路由嵌套,会触发 Domain route not support nested 错误并中断整个路由加载。
绑定中间件并控制执行顺序
第一步:在 app/middleware.php 的 ['http'] 数组中注册全局中间件,例如 ['appmiddlewareAuthCheck'];此数组内中间件按声明顺序从前到后执行。
第二步:对特定路由分组绑定中间件,例如 Route::group('admin')->middleware(['appmiddlewareAdminAuth', 'throttle:5,1']); 注意中间件类名必须带完整命名空间,漏写 appmiddleware 会导致 Class not found。
第三步:在中间件 handle 方法末尾【必须显式 return $next($request)】,少这一句,请求就卡死在中间件,既不报错也不响应,调试时只能靠日志定位。
第四步:若某路由需跳过权限中间件(如登录接口),不要在中间件里写 if (in_array($url, [...])) 判断,而应在路由定义时加 ->except(['appmiddlewareAuthCheck']) —— 这才是 TP6.1 官方支持的排除方式。
启用注解路由并配置控制器路径
方法一:启用注解需两步。先在 config/app.php 中设 'route_annotation' => true;再确保控制器类顶部有 @mixin thinkApp 注解(非必需但推荐),且方法上有 @RequestMapping(path="user", method="GET") 等标准注解。
方法二:注解扫描路径必须与命名空间严格对应。若控制器位于 app/controller/api/v1/User.php,命名空间为 appcontrollerpi1,则 config/route.php 中必须设置 'controller_path' => ['app\controller\api\v1'],否则注解路由不会被识别。
方法三:注解路由不支持 prefix 自动注入到闭包参数,只对控制器方法有效;若用闭包定义路由(Route::get(..., function(){})),注解完全无效,别混用。
调试路由匹配过程
开启调试模式后,在任意控制器方法中插入 dump($this->request->rule());,访问该路由即可看到当前匹配到的 Route 对象,其中 name 属性即为路由规则名(如 'api/v1.user'),【此 name 值必须与 RBAC 权限表 auth_rule.name 字段完全一致】,大小写、点号、斜杠缺一不可。
执行 php think route:scan 可强制重新扫描注解路由并刷新缓存,适用于修改注解后页面未更新的情况;但若 route/app.php 本身有语法错误,该命令会直接报错退出,不生成任何缓存。
查看 runtime/log 下最新日志文件,搜索 “Route match” 关键字,可定位框架内部路由匹配全过程,包括候选规则数、正则匹配耗时、中间件堆栈等原始信息。



















