thinkphp 8注解路由需先安装topthink/think-annotation扩展,再在bootstrap.php中调用annotationroute::init()启用;仅支持php 8属性语法#[route],且必须为public方法,多应用需在config/annotation.php中配置controllers扫描路径并执行php think clear:route清除缓存。

ThinkPHP 8.0 的注解路由不是写完就能用,必须先装扩展、再显式初始化、最后按 PHP 8 属性语法写在 public 方法上——漏掉任一环,php think route:list 就看不到任何注解路由。
注解路由启用前必须做的两件事
TP8 默认不加载注解路由能力,它被抽离为独立扩展,且不自动注册。常见错误是写了 #[Route] 却收不到请求,根本原因是没走通这两步:
- 执行
composer require topthink/think-annotation安装扩展(TP8.0+ 不内置) - 在
app/bootstrap.php或自定义服务提供者中调用AnnotationRoute::init()
注意:config/annotation.php 里 'route' => ['enable' => true] 只控制是否启用路由解析器,但不触发扫描;不调用 init(),控制器方法上的注解永远不会被读取。
#[Route] 和 #[Get]/#[Post] 的写法与限制
PHP 8 属性语法是唯一有效形式,旧版 /** @Get */ 文档注释在 TP8 中完全无效。快捷注解只是语法糖,底层全转成 #[Route],但它们支持的参数范围不同:
-
#[Get('user/:id')]等价于#[Route('user/:id', method: 'GET')],仅支持 path 和 method - 要加中间件、域名约束、正则 pattern 或路由名,必须用
#[Route],例如:#[Route('admin/:id', method: 'GET', middleware: 'auth', domain: 'admin.example.com', name: 'admin.user.view')] - 快捷注解里硬写
middleware字段会被静默忽略,不会报错也不会生效
多应用下注解不生效?检查控制器命名空间和扫描配置
默认情况下,topthink/think-annotation 只扫描 appcontroller 命名空间。如果你建了 admin 应用,控制器在 appdmincontroller 下,那它根本不会被扫描到。
开箱即用的技能链路由引擎。13 条预定义链覆盖搜索、开发、审查、MLOps、法律、创意等场景,三层路由架构(触发词→SAD反馈→DAG编排),recall@10=96.97%。配置驱动(chains.yaml),零代码扩展。pip install skill-weave-chains 一键安装。
解决办法是修改 config/annotation.php 中的 controllers 配置:
'route' => [
'enable' => true,
'controllers' => [
'app\controller',
'app\admin\controller',
'app\api\controller',
],
],
路径必须用双反斜杠转义,且不能漏掉末尾的 \controller;只写 app\admin 是无效的。改完后务必执行 php think clear:route,否则缓存仍指向旧扫描范围。
注解修改后没反应?缓存机制是最大盲区
TP8 注解路由依赖运行时反射 + AST 解析,首次请求或执行 php think route:list 时才会生成缓存。但这个缓存不会自动更新——哪怕你删了整行 #[Route],只要没清缓存,旧路由依然存在,新注解也不生效。
开发中必须养成习惯:
- 每次修改注解后,立即运行
php think clear:route - 不要依赖浏览器刷新或重启 PHP-FPM,那对注解缓存无效
- 生产环境可启用
php think route:cache,但开发阶段禁用或手动清理更安全
最易忽略的是:缓存文件存放在 runtime/route/,但直接删目录不如用命令可靠,因为命令会同时清除内存中的路由映射。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










