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的存儲信息,也只須要一個方法便可,在項目中給咱們提供了很大的方便性