TP5.1使用者登入成功處理儲存使用者資訊Session優化
阿新 • • 發佈:2018-12-18
author:咔咔
wechat:fangkangfk
在使用者登入成功後,我們會將使用者的資訊儲存到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的儲存資訊,也只需要一個方法即可,在專案中給我們提供了很大的方便性