thinkphp 8.0 路由机制是架构级重构,非平滑升级:php 版本升至 8.0.2+ 并强制使用原生 attribute;多模块需手动配置 annotation.php 扫描路径;路由改用声明式注解;中间件须显式绑定;修改后必须执行 php think clear --all 清缓存。

ThinkPHP 5.1 和 8.0 的路由机制不是平滑升级,而是架构级重构。尤其在多模块(即多应用)场景下,配置逻辑、生效条件和底层依赖完全不同。直接迁移旧配置大概率导致 404、注解不扫描、中间件失效或路由静默跳过。
PHP 版本与语法基础不可混用
TP5.1 运行于 PHP 7.1–7.4,依赖文档块注释(如 /** @route */)和运行时反射解析;TP8.0 强制要求 PHP 8.0.2+,全面采用 PHP 原生 Attribute(如 #[Route]),且构造函数属性提升、联合类型、命名参数等特性已深度融入框架内核。若用 TP5.1 的写法套在 TP8.0 上,连类加载都会失败——报错 Parse error: syntax error, unexpected token "string" 是典型信号。
多模块目录结构与命名空间需显式声明
TP5.1 的多模块(如 admin/, api/)本质是 app/ 下的子目录,框架通过 MODULE_ALLOW_LIST 和 APP_SUB_DOMAIN_DEPLOY 等配置自动识别控制器路径,扫描范围默认覆盖 app*controller。
TP8.0 则完全剥离自动发现逻辑:topthink/think-annotation 扩展默认只扫描 appcontroller 命名空间。新增的 admin 应用控制器位于 appdmincontroller,必须手动将其加入扫描白名单,否则 #[Route] 标记会被彻底忽略。
关键操作是修改 config/annotation.php:
return [
'route' => [
'enable' => true,
'controllers' => [
'app\controller', // 默认应用
'app\admin\controller', // 后台模块
'app\api\controller', // 接口模块
],
],
];
路由定义方式从集中式转向声明式
TP5.1 路由统一写在 route/route.php 或 route/app.php 中,靠字符串匹配绑定到控制器方法,例如:
Route::get('admin/login', 'admin/Login/index');
TP8.0 注解路由要求控制器方法自身携带路由元信息:
<?php namespace appdmincontroller;
use thinknnotation
outeRoute;
class Login
{
#[Route('GET', 'admin/login')]
public function index()
{
return 'admin login page';
}
}注意:#[Route] 必须配合 use 导入,且类必须被自动加载器识别(即命名空间与物理路径严格一致)。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
中间件绑定逻辑发生根本变化
TP5.1 中,模块级中间件可通过 app/admin/middleware.php 配置,自动应用于该模块全部路由。
TP8.0 不再支持模块级中间件自动继承。每个路由需显式绑定:
#[Route('GET', 'admin/dashboard')]
#[Middleware(DashboardAuth::class)]
public function dashboard()
{
// ...
}或者在分组中统一追加:
#[Group('admin')]
#[Middleware(AdminAuth::class)]
class AdminBase {}未显式声明,中间件就不会执行——没有“默认生效”一说。
最后务必清空缓存
TP8.0 路由注解扫描结果会缓存到 runtime/annotation 目录。修改 annotation.php 或新增控制器后,必须执行:
php think clear --all
否则旧缓存仍生效,新路由始终不注册。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










