author:咔咔
wechat:fangkangfk
源码:https://download.csdn.net/download/fangkang7/10749294
在用户登录成功后,我们会将用户的信息存储到session中
步骤:
我们在用户登录后会储存很多的用户信息,也会设置很多的session的key,后期项目不方便维护和管理
这就需要创建一个工具类来管理我们的SESSION储存用户信息(app\util\SC),将我们需要处理的所有的存储操作放置里边
在下来就是创建门面类(facade\SC)代理这个工具类,在这一步我们需要创建config\facade。放置facade的配置
下来就需要创建钩子初始化
源码:
<?php
namespace app\service;
use app\model\user\User;
use Session;
class UserService
{
// 定义多种登录方式
private $loginWay = [
// 用户名
'user_name',
// 邮箱
'user_emal',
// 电话
'user_tel'
];
public function login($username,$password)
{
// 使用循环方式判断用户名是否存在
foreach($this->loginWay as $k=>$v){
$user = User::where([$v=>$username])->find();
// 如果存在就有这个用户,跳出
if($user){
break;
}
}
if(!$user){
//用户名不存在
return ERROR_NO_USER;
}
if($user->user_status != 1){
// 用户是否被封
return ERROR_USER_START;
}
if(!password_verify($password,$user->user_password)){
// 密码错误,登录失败
return ERROR_PASSWORD;
}
// 用户登录成功后操作存储用户信息
$data = [
'uid' => $user->uid,
'user_name'=>$user->user_name,
'is_system'=>$user->is_system,
'nick_name'=>$user_name,
'role_id'=>$user->role_id
];
Session::set('USER_INFO_SESSION',$data);
//登录成功
return SUCCESS;
}
}
很明显为了保障方法的单一原则,我们需要对用户登录后的存储信心数据进行分离
我们就可以创建一个方法来专门处理存储用户信息的操作
源码:
<?php
namespace app\service;
use app\model\user\User;
use Session;
class UserService
{
// 定义多种登录方式
private $loginWay = [
// 用户名
'user_name',
// 邮箱
'user_emal',
// 电话
'user_tel'
];
public function login($username,$password)
{
// 使用循环方式判断用户名是否存在
foreach($this->loginWay as $k=>$v){
$user = User::where([$v=>$username])->find();
// 如果存在就有这个用户,跳出
if($user){
break;
}
}
if(!$user){
//用户名不存在
return ERROR_NO_USER;
}
if($user->user_status != 1){
// 用户是否被封
return ERROR_USER_START;
}
if(!password_verify($password,$user->user_password)){
// 密码错误,登录失败
return ERROR_PASSWORD;
}
// 用户登录后的操作
$this->initLogin($user);
//登录成功
return SUCCESS;
}
// 登入初始化
public function initLogin()
{
// 用户登录成功后操作存储用户信息
$data = [
'uid' => $user->uid,
'user_name'=>$user->user_name,
'is_system'=>$user->is_system,
'nick_name'=>$user_name,
'role_id'=>$user->role_id
];
// 存储用户信息
Session::set('USER_INFO_SESSION',$data);
// 存储用户角色
Session::set('USER_ROLE_SESSION',$user->role_id);
// 存储是否是系统后台的用户
Session::set('USER_IS_SYSTEM',$user->is_system);
}
}
我们就会发现需要存储的信息是比较多的,这里只是做了存储用户信息,用户退出后我们还是需要在写一遍,这是不合适的
所以我们就创建一个工具类SC
源码:
<?php
namespace app\util;
use Session;
/**
* 工具类
* 用户缓存 facade代理 SC
*/
class SC
{
/**
* 用户登录的session key
*/
CONST LOGIN_MARK_SESSION_KEY = 'LOGIN_MARK_SESSION';
/**
* 权限信息
* @var string
*/
CONST USER_ROLE_SESSION = 'USER_ROLE_SESSION';
/**
* USER用户信息
* @var string
*/
CONST USER_INFO_SESSION = 'USER_INFO_SESSION';
// /**
// * 是否设置用户登入的有效时间
// * @var string
// */
// CONST CHECK_TIME_SESSION = 'CHECK_TIME_SESSION';
//
// private $checkTime = false;
//---------------------------设置和判断用户的是否登入
// 设置用户登入token
public function setLogin($value)
{
Session::set(self::LOGIN_MARK_SESSION_KEY, password_hash($value, 1));
}
// 判断用户是否登入成功
public function getLogin()
{
Session::get(self::LOGIN_MARK_SESSION_KEY);
}
//---------------------------设置用户和获取用户的登入信息
// 设置用户的信息
public function setUserInfo($value)
{
Session::set(self::USER_INFO_SESSION, $value);
}
// 获取用户的信息
public function getUserInfo()
{
Session::get(self::USER_INFO_SESSION);
}
//--------------------------设置和获取用户的权限
// 设置用户的信息
public function setUserRole($value)
{
Session::set(self::USER_ROLE_SESSION, $value);
}
// 获取用户的信息
public function getUserRole()
{
Session::get(self::USER_ROLE_SESSION);
}
//-------------------------用户退出清空用户缓存信息
// 退出登入
public function clear()
{
Session::del(self::USER_INFO_SESSION);
Session::del(self::USER_ROLE_SESSION);
Session::del(self::LOGIN_MARK_SESSION_KEY);
}
}
创建门面类代理工具类SC
配置门面类
创建门面类SC
创建钩子
源码:
<?php
namespace app\behavior;
use Config;
use think\Facade;
use think\Loader;
class LoadBehavior
{
public function run()
{
// 门面类facade注册
Facade::bind(Config::get('facade.facade'));
// 别名注册
Loader::addClassAlias(Config::get('facade.alias'));
}
}
初始化钩子
下来就可以直接在service/UserService中使用了
这样就解决了登入后信息储存的方便,还有一个方法就是用户退出后清除session的存储信息,也只需要一个方法即可,在项目中给我们提供了很大的方便性