摘要:新版本不支持操作原生 $_SESSION 数组和所有 session_开头的函数,只能通过 Session 类(或者助手函数)来操作。会话数据统一在当前请求结束的时候统一写入 所以不要在 session 写入操作之后执行 exit 等中断操作,否则会导致 Session 数据写入失败。
目录
1. tp6 session设置不生效
TP6 默认是关闭SESSION,需要在项目中间件或者全局中间件中打开
找到 app/middleware.php 文件添加如下代码:
<?php
// 全局中间件定义文件
return [
// 全局请求缓存
// \think\middleware\CheckRequestCache::class,
// 多语言加载
// \think\middleware\LoadLangPack::class,
// Session初始化
\think\middleware\SessionInit::class
];
或者在项目文件夹下的 app/admin/middleware.php 添加以下代码:
<?php
return [
\think\middleware\SessionInit::class
];
但thinkphp6中有个session的设置有一个特殊情况,那就是不能在你设置session的方法中使用exit或者die操作,否则session无法生效,我就是因为在设置session时,代码最后使用了exit进行返回操作json,导致无法生效,这点要注意。
//session不生效的代码
function success($data=[],$msg=''){
$code = ErrorCode::SUCCESS;
$msg = !empty($msg)?$msg:ErrorCode::getError($code);
exit(json_encode([
'code'=>$code,
'message'=>$msg,
'datas'=>$data
]));
}
//修改后的代码
function success($data=[],$msg=''){
$code = ErrorCode::SUCCESS;
$msg = !empty($msg)?$msg:ErrorCode::getError($code);
echo(json_encode([
'code'=>$code,
'message'=>$msg,
'datas'=>$data
]));
}
2. 在配置文件中设置为使用JSON序列化需要注意的问题
//config/session.php
<?php
return [
//....
//新加
'serialize' => ['json_encode', 'json_decode'],
];
通过上面设置session序列化后,如果使用了验证码功能会出现验证码验证失败的问题。通过分析源码:
//文件路径:vendor/topthink/think-captcha/src/Captcha.php
/**
* 验证验证码是否正确
* @access public
* @param string $code 用户验证码
* @return bool 用户验证码是否正确
*/
public function check(string $code): bool{
if (!$this->session->has('captcha')) {
return false;
}
$key = $this->session->get('captcha.key');
$code = mb_strtolower($code, 'UTF-8');
$res = password_verify($code, $key);
if ($res) {
$this->session->delete('captcha');
}
return $res;
}
可以知道获取存在session中的验证码代码为:
$key = $this->session->get('captcha.key');
这样获取到的key为空,需要修改为:
$key = $this->session->get('captcha')->key;
这样才能确保获取到存在session中验证码。
这里官方不建议把对象存在session中,也不建议修改验证码的源码
手机扫码阅读,舒服~