tp8.0废弃think\facade\cookie,须改用think\helper\cookie或cookie()函数;cookie()仅支持数组参数,domain需配secure,samesite为lax默认,加密依赖cookie_secret环境变量。

ThinkPHP 8.0 的 Cookie 操作逻辑变了,think\facade\Cookie 已废弃,必须用 think\helper\Cookie;不改调用方式会导致“Class not found”或静默失败。
用 think\helper\Cookie 替代门面类
TP8.0 把 Cookie 功能从门面(Facade)移到了助手函数(Helper),think\facade\Cookie 不再存在。继续用旧写法会报错或读不到值。
- 错误写法:
use think\facade\Cookie; Cookie::set('lang', 'zh'); - 正确写法:
use think\helper\Cookie; Cookie::set('lang', 'zh'); - 助手函数
cookie()仍可用,但底层已绑定新 Helper 类,行为一致 - 若项目混用 TP6/TP7 升级到 TP8,全局搜索替换
think\facade\Cookie是必须步骤
cookie() 函数参数格式要统一
TP8.0 中 cookie() 不再兼容老式字符串参数(如 'expire=3600&prefix=tp_'),只接受数组形式选项,否则会被忽略或解析出错。
- 失效写法:
cookie('token', 'abc123', 'expire=86400&secure=true'); - 有效写法:
cookie('token', 'abc123', ['expire' => 86400, 'secure' => true]); - 省略选项时可传整数(视为 expire),但建议始终用数组,避免歧义
- 所有安全字段(
secure、httponly、samesite)必须显式声明,不再继承 config/app.php 的默认值
跨子域和 HTTPS 下的 domain 与 secure 必须配对
在子域名(如 admin.example.com 和 api.example.com)间共享 Cookie,光设 domain => '.example.com' 不够,secure => true 必须同时开启,否则浏览器直接拒绝写入。
- 开发环境用
localhost时不能设domain,浏览器策略禁止;调试请切到test.example.com类似域名 - 反向代理(如 Nginx 终止 HTTPS)场景下,需在
public/index.php开头补$_SERVER['HTTPS'] = 'on';,否则secure => true形同虚设 -
samesite默认为'Lax',若需支持扫码登录等跨站 POST 回调,得设成'None',且必须搭配secure => true
加密 Cookie 要检查 auto_encrypt 和密钥是否生效
TP8.0 加密开关仍在 config/app.php 的 cookie.auto_encrypt,但密钥来源优先读 env('COOKIE_SECRET'),而非配置文件里的 secret_key。
- 确认
.env文件中已设置:COOKIE_SECRET=your_32_char_random_string - 加密仅作用于值(value),不影响键名(key);前缀(
prefix)也不参与加密 - 启用后,手动用
setcookie()写入的 Cookie 不会被加密,也不会被Cookie::get()自动解密 - 调试时可临时关闭加密,对比响应头中
Set-Cookie值是否明显变长,来验证是否生效
TP8.0 的 Cookie 操作不是“换个类名就行”,domain、secure、samesite、auto_encrypt 这四个点一旦漏掉任一条件,就可能在生产环境悄无声息地失效——尤其跨子域和 HTTPS 场景下,浏览器根本不发请求头,连日志都难排查。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











