ThinkPHP 8.0 中定义 GET 路由首选 Route::get()(仅限简单场景),复杂需求须用 Route::rule() 或 #[Route] 注解;前者不支持中间件、域名、正则约束等,后者才完整支持高级配置。

在 ThinkPHP 8.0 中定义 GET 路由,最直接的方式是使用 Route::get() 方法,但要注意它仅适用于简单场景;若需中间件、域名限制、参数规则等能力,必须改用 Route::rule() 或 #[Route] 注解。
基础 GET 路由:适合静态路径或简单变量
适用于无需额外配置的常规页面或接口:
-
Route::get('about', 'Page/about');—— 匹配/about -
Route::get('user/:id', 'User/read');—— 匹配/user/123,:id默认接收任意非斜杠字符 - 变量可加正则约束:
->pattern(['id' => '\d+']),防止非法值进入控制器
带约束和中间件的 GET 路由:必须用 Route::rule()
Route::get() 不支持中间件、域名、pattern 等高级配置,强行添加会被忽略且无提示。正确写法是:
修复 Core bailout 状态损坏安全问题,以及 BZ2、DOM、PDO、Opcache/JIT 内存与执行错误,改进 Unicode 字素处理、URL 解析、TLS 流状态、信号分发及会话错误处理。
Route::rule('admin/:id', 'Admin/User/detail')->method('GET')->middleware('auth')->pattern(['id' => '\d+']);- 若需限定域名:
->domain('admin.example.com')必须跟在rule()后链式调用 - 注意:method 参数必须显式写
'GET',不能省略
注解方式:#[Get] 仅作快捷,#[Route] 才完整
启用注解路由需先安装扩展并初始化(composer require topthink/think-annotation + AnnotationRoute::init()):
立即学习“PHP免费学习笔记(深入)”;
-
#[Get('api/user/:id')]等价于#[Route('api/user/:id', method: 'GET')],仅限简单路径 - 要加权限或域名?只能用
#[Route('admin/:id', method: 'GET', middleware: 'auth', domain: 'admin.example.com')] - 方法必须是
public,控制器命名空间需匹配app/controller或多应用结构
常见错误提醒
避免踩坑:
- 混用
Route::get()和Route::resource()时,如都注册了user/:id,TP8 按注册顺序取第一个,易导致预期外的 404 或逻辑错乱 - 多语言路由中,
/en/about不能靠Route::get('about', ...)实现,必须显式捕获:lang并配合中间件切换语言 - 模型绑定需单独调用
->bind(['id' => \app\model\User::class]),Route::get()本身不触发自动绑定


















