ThinkPHP6后台路由必须用Route::group('admin')包裹并指定命名空间,否则路径匹配失控;模板需用admin@login语法,静态资源用__ADMIN__/统一替换,session与验证码须手动启用并校验。

ThinkPHP6 路由分组 + admin 模块必须配对使用
不配 Route::group('admin'),直接在 route/app.php 里写 Route::get('login', 'admin/Login/index'),后续所有路径都会失控。比如你加个菜单跳转 /admin/index,实际会匹配到前台的 index 控制器,而不是 app/admin/controller/Index.php。
正确做法是:所有后台路由必须包裹在分组里,并显式指定模块命名空间:
Route::group('admin', function () {
Route::get('login', 'Login/index');
Route::post('login', 'Login/login');
Route::get('index', 'Index/index')->middleware('check_login');
})->ext('html'); // 防止被猜出 .php 后缀
- 分组前缀
admin会自动映射到app/admin/目录,控制器类自动加载app\admin\controller\*命名空间 - 中间件
check_login只需挂一次,不用每个路由重复写->middleware() - 别漏掉
->ext('html'),否则攻击者可能用/admin/login.php绕过路由规则
View::fetch() 的模块语法不能省略
写 return View::fetch('login') 会去当前模块(比如 app/index/view/)找模板,不是后台的;写 return View::fetch('admin@login') 才能精准定位到 app/admin/view/login.html。
硬编码路径如 ../view/admin/login.html 在 TP6 中默认被禁用,会报 Template not found 错误。
立即学习“PHP免费学习笔记(深入)”;
-
admin@login是标准写法,表示“admin 模块下的 login 模板” - 如果用了多应用(
think-multi-app),还要确认config/app.php中'default_app' => 'admin'是否设对,否则View::fetch()仍会 fallback 到 index 模块 - 模板里引用静态资源统一用
__STATIC__/admin/css/app.css,别用相对路径或./开头
验证码和 Session 必须手动开启并验证
TP6 默认不启用 session,也不自带验证码——装了 think-captcha 包后,captcha() 函数仍会报错,因为底层依赖 session。
两个关键动作缺一不可:
- 打开
app/middleware.php,取消注释这行:\think\middleware\SessionInit::class - 登录方法中不能只比对明文密码,必须调用
captcha_check()并校验返回值:if (!captcha_check($data['captcha'])) { $this->error('验证码错误'); } - session 写入要带有效期:
session('admin_user', ['id' => $user['id'], 'username' => $user['username']], 3600),避免长期驻留服务端
H-UI 或 layuiAdmin 的静态路径容易 404
把 H-UI 解压到 public/static/admin/ 后,页面里写的 src="lib/layui/layui.js" 会 404,因为真实路径是 /static/admin/lib/layui/layui.js。
不要改 HTML 里的每一个 src,统一用配置解决:
- 在
config/view.php中设置:'view_replace_str' => ['__ADMIN__' => '/static/admin'] - 模板中改写为:
<script src="__ADMIN__/lib/layui/layui.js"></script> - 注意:H-UI 的
login.html里常有href="javascript:;"或空action,这些不会 404,但提交时若没配好路由前缀,会发到根路径导致 404 或 500
真正卡住人的往往不是框架语法,而是路由分组没生效、模板没走对模块、静态资源路径没替换、session 和验证码不同步这几个点。每一步都得对着日志看真实请求路径,别只信浏览器地址栏显示的内容。



















