[英]Storing user info in a session using an object vs. normal variables
我正在為我的網站實施用戶身份驗證系統。 我正在使用一個開源庫,通過創建一個User對象並將該對象存儲在我的php SESSION變量中來維護用戶信息。 這是存儲和訪問該信息的最佳方式嗎?
我發現訪問用戶變量有點麻煩,因為我必須首先創建一個對象來訪問它們:
$userObj = $_SESSION['userObject'];
$userObj->userId;
而不是像這樣只訪問用戶ID,我通常會存儲用戶ID:
$_SESSION['userId'];
將一堆用戶數據存儲為對象而不是僅將它們存儲為單獨的SESSION變量是否有優勢?
ps - 庫似乎也在用戶對象(id,用戶名,加入日期,電子郵件,最后一個用戶數據庫查詢)中存儲了一些變量,但我真的不在乎將所有信息存儲在我的會話中。 我只想保留用戶ID和用戶名。
我認為邏輯上將相關數據分組在一個密鑰下是最好的,它將相關數據與一個共同的父親耦合,它還為你提供了更多關於鍵名的空間,所以你可以有$_SESSION['user']->id
與$_SESSION['user_id']
,允許您擁有屬性名稱上下文 ,因此您不必像使用user_*
鍵那樣在鍵名中提供上下文
我還認為這里有一個更大的概念,當你使用user_*
你幾乎都說任何鍵名為user_*
都會與用戶相關聯。 這不是組織IMO對象的好方法。 但是,當您使用user
密鑰並將其下面的所有相關數據粘貼在其下時,您可以獲得更清晰的頂級和真正的嵌套數據層次結構,而不是線性數據層次結構。
為什么不創建一個處理數據訪問和存儲的會話包裝類? 這將產生更清晰的代碼和抽象,因此對存儲方法的更改非常簡單。
這是一個包裝器的例子:
abstract class Session
{
private static $_started = false;
private static $_driver;
public static function start($driver = "native", $site = "default")
{
if(self::$_started === false)
{
require_once "drivers/" . $driver . ".php";
self::$_driver = new $driver($_site);
}
}
public static function set($key,$value)
{
self::$_driver->set($key,$value);
}
public static function get($key)
{
self::$_driver->get($key);
}
public static function remove($key)
{
self::$_driver->remove($key);
}
}
以上只是簡單但你應該明白,你還必須創建具有所需方法集的本機驅動程序文件,並且它們應該相應地存儲會話數據。
使用Session類的示例如下:
Session::start("native");
/*
* Generic Code
*/
Session::set("key","value (:");
在獲取“用戶”對象時,您可以像這樣簡單:
Session::get("userObj")->id;
產生更清晰的代碼和更大的范圍問題。
經過一段時間后,您可以創建一個新的驅動程序,用於存儲在數據庫中,然后只需將驅動程序從本機更改為數據庫。
注意:在數據庫中存儲對象可能有點小問題,特別是如果您的代碼沒有被組織為在用戶類在范圍之前加載會話,那么您可以在會話中獲得部分對象,這將導致缺乏功能。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.