ThinkPHP 8.0 路由迁移需重构底层机制:停用字符串控制器写法,改用完整命名空间;中间件传类而非别名;启用注解路由需安装扩展、初始化并配置扫描路径;资源路由按应用单独定义;域名路由须先绑定应用再细化规则。

ThinkPHP 5.1 到 8.0 的路由迁移不是语法微调,而是底层机制重构。5.1 的字符串路径+闭包/控制器方法映射,在 8.0 中被注解、分组、域名、资源路由等多层结构替代。不重写路由逻辑,应用无法启动或大量 404。
停用旧路由写法,改用闭包+完整命名空间
TP5.1 中常见的 Route::get('admin','admin/index') 或 Route::rule('user/:id','user/read') 在 TP8.0 中仍可运行,但中间件、域名绑定等高级能力必须显式声明类名。
- 将字符串控制器写法改为完整命名空间:如
'admin/index'→\app\admin\controller\Index::class - 中间件必须传类,不能传别名:
->middleware('auth')改为->middleware(\app\middleware\Auth::class) - 所有闭包路由需确保在
route/route.php中,且文件首行有use think\facade\Route;
启用注解路由:安装、初始化、扫描三步缺一不可
TP8.0 的 #[Route] 不是“装了就能用”,它依赖扩展主动扫描,且默认只扫 app\controller。
PHP 8.5.12 RC 1 候选版修复 BZ2、DOM、PDO、Opcache/JIT 和扩展内存安全问题,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
- 执行
composer require topthink/think-annotation:^8.0,不要装topthink/framework - 在
app/bootstrap.php或服务提供者中调用think\annotation\Route::init(); - 检查
config/annotation.php,确认'route' => ['enable' => true],并补充多应用路径:'controllers' => ['app\controller', 'app\admin\controller'] - 控制器类必须是
public方法,且命名空间与扫描路径严格匹配(如app\admin\controller\User对应app\admin\controller)
资源路由必须按应用目录单独定义
TP8.0 的 Route::resource() 不再全局生效,它只在当前应用的 route/app.php 中起作用,且路径前缀由应用结构隐式决定。
立即学习“PHP免费学习笔记(深入)”;
- 进入
app/admin/route/app.php,首行加use think\facade\Route; - 添加
Route::resource('user', 'Admin/User')->name('admin.user');,生成/admin/user等标准 REST 路径 - 控制器
Admin/User必须真实存在,方法签名需匹配(如edit($id)、update(Request $request, $id)) - 若要加前缀(如
/v2/user),需在外层套Route::group('v2', function () { ... })->prefix('v2');
域名与子域名路由需双层配置
仅写 Route::domain() 不会生效。必须先完成应用级绑定,再在路由层细化规则。
- 在
config/app.php中开启多应用:'auto_multi_app' => true,并配置'domain_bind' => ['admin.example.com' => 'admin'](注意:键必须含完整域名,不能嵌套) - 启用子域名部署时,设
'APP_SUB_DOMAIN_DEPLOY' => 1和'APP_SUB_DOMAIN_RULES' => ['admin' => 'admin'],主域名后缀如com.cn需配'APP_DOMAIN_SUFFIX' - 在
route/route.php中使用Route::domain('admin.example.com', function () { Route::get('user', 'Admin/User/index'); }); - Nginx/Apache 必须正确转发请求到
index.php,否则路由层根本不会触发


















