sessioninit中间件必须显式启用,否则验证码、登录态等功能全部失效;需在app/middleware.php中取消注释\think\middleware\sessioninit::class,并通过session('test','ok')实测验证是否生效。

SessionInit中间件必须显式启用,否则验证码、登录态全失效
ThinkPHP 6/8 默认不初始化 Session,哪怕你写了 session('user', 'xxx') 或调用 Session::set(),也静默失败——不会报错,不会写日志,captcha_check() 永远返回 false。根本原因不是配置错,是中间件根本没加载。
打开 app/middleware.php 取消注释那一行
编辑 app/middleware.php 文件,找到这行:
// \think\middleware\SessionInit::class
删掉开头的 //,改成:
\think\middleware\SessionInit::class
注意几点:
- 不要加引号,不要加逗号(除非它在数组末尾且前面已有其他项)
- 确保它在全局中间件数组里,不是注释块内部,也不是被其他条件包裹
- 多应用模式下,如果只在某个子应用用 Session,可改到对应应用的
middleware.php中
验证 Session 是否真生效,别信“看起来能跑”
光改完文件不等于成功。必须实测:
- 在任意控制器方法中写:
session('test', 'ok'); var_dump(session('test')); - 访问该接口,输出必须是
string(2) "ok" - 如果输出
null或空字符串,说明中间件未生效,回退检查路径、拼写、是否被其他中间件拦截 - 不要用
$_SESSION或session_start()测试——TP6/8 禁用原生方式,它们完全无效
常见连带问题:开了中间件但还是取不到值
即使 SessionInit 已启用,仍可能因以下原因导致读写异常:
-
runtime/session/目录无写权限(文件驱动时) - 配置了
session.prefix但多个子应用用了不同 prefix,导致会话不共享(尤其 TP8 多应用) - Redis 驱动未启用 phpredis 扩展,或
config/session.php中type写成'redis'却没配host/port - 用了
Cookie::set()误以为是 Session——二者完全独立,不能混用
Session 初始化是个开关型动作,开与不开之间没有中间状态;一旦漏掉,所有依赖它的功能(验证码、登录保持、flash 提示)都会无声崩坏。最稳妥的做法是:改完 middleware.php 后,立刻跑一次 session('test', ...) 验证,而不是等验证码校验失败再回头查。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











