ThinkPHP 6.0+ 中 token() 函数已移除,须启用 TokenValidateMiddleware 中间件,表单隐藏域仍写 {:token()}(由中间件自动注入),且依赖 session 正常工作与域名/端口一致。

ThinkPHP 6.0+ 中 token() 函数已不可用
直接调用 token() 或在模板中写 {:token()} 会报错:「Function token not found」。这是因为 ThinkPHP 6.0 起彻底移除了全局函数式令牌生成,改由中间件 + 请求生命周期统一管控。如果你是从 TP5 升级上来,别再找替代函数——它本就不该在视图层手动生成。
必须启用 TokenValidateMiddleware 中间件
TP6 的 Token 验证完全依赖中间件拦截,不注册就等于没开。默认配置下该中间件未启用,需手动加入 app/middleware.php:
return [
// 其他中间件...
\think\middleware\TokenValidateMiddleware::class,
];
注意两点:
- 该中间件仅对
POST、PUT、DELETE请求生效,GET请求不会校验 - 若使用多应用模式,需在对应应用的
middleware.php中注册,而非全局入口 - 中间件顺序无关紧要,但它必须在
SessionInit之后运行(否则拿不到 session 数据)
表单里必须用 token 隐藏域,且不能手动生成值
模板中仍需保留 这类写法,但此时的 {:token()} 是模板引擎自动注入的(由中间件预设),不是调用函数。实际渲染时,框架会在响应输出前把 {:token()} 替换为当前有效令牌字符串。
常见错误:
- 手动拼接
value,比如value=""—— 漏掉中间件注入逻辑,必然验证失败 - 把
__token__改成其他字段名(如csrf_token)—— 中间件只认默认名,不识别自定义 - AJAX 提交时没带
__token__字段,或从 URL 参数传(如?__token__=xxx)—— 中间件只从 POST body 读取
调试 Token 失败时优先检查 session 和域名一致性
Token 验证失败(报错「token error」)80% 以上不是代码问题,而是环境配置偏差:
-
session必须可用:确保session.auto_start = false(TP6 要求手动启动),且session.save_path可写 - 前后端域名/端口必须一致:前端用
http://localhost:8080访问,后端却配了cookie.domain = '.example.com',会导致 session 写入失败,进而令牌为空 - 如果用了 Nginx 反向代理,确认是否透传了
Cookie头,特别是SameSite=None; Secure场景下缺少Secure标志也会静默丢弃 cookie
Token 本质是 session 绑定的一次性哈希值,session 断了,令牌就断了——所有“生成失败”“验证不通过”的现象,先盯住 session 是否真正落盘。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











