author:咔咔
wechat:fangkangfk
源码:https://download.csdn.net/download/fangkang7/10749294php
在用户登陆成功后,咱们会将用户的信息存储到session中缓存
步骤:session
咱们在用户登陆后会储存不少的用户信息,也会设置不少的session的key,后期项目不方便维护和管理app
这就须要建立一个工具类来管理咱们的SESSION储存用户信息(app\util\SC),将咱们须要处理的全部的存储操做放置里边工具
在下来就是建立门面类(facade\SC)代理这个工具类,在这一步咱们须要建立config\facade。放置facade的配置ui
下来就须要建立钩子初始化this
源码:url
<?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; } }
很明显为了保障方法的单一原则,咱们须要对用户登陆后的存储信心数据进行分离spa
咱们就能够建立一个方法来专门处理存储用户信息的操做.net
源码:
<?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的存储信息,也只须要一个方法便可,在项目中给咱们提供了很大的方便性