我正在为我的网站实施用户身份验证系统。我正在使用一个开源库,通过创建一个User对象并将该对象存储在我的php SESSION变量中来维护用户信息。这是存储和访问该信息的最佳方式吗?
我发现访问用户变量有点麻烦,因为我必须首先创建一个对象来访问它们:
$userObj = $_SESSION['userObject'];
$userObj->userId;
而不是像这样只访问用户ID,我通常会存储用户ID:
$_SESSION['userId'];
将一堆用户数据存储为对象而不是仅将它们存储为单独的SESSION变量是否有优势?
ps - 该库似乎也在用户对象(id,用户名,加入日期,电子邮件,最后一个用户数据库查询)中存储了一些变量,但我真的不在乎将所有信息存储在我的会话中。我只想保留用户ID和用户名。
答案 0 :(得分:3)
我认为在一个键下将相关数据逻辑分组在一起是最好的,它将相关数据与一个共同的父级耦合,它还为您提供了关于键名的更多摆动空间,因此您可能会$_SESSION['user']->id
反对到$_SESSION['user_id']
,允许您拥有属性名称 context ,因此您不必像使用user_*
键那样在密钥名称中提供上下文
我还认为这里有一个更大的概念,当你使用user_*
时,你几乎都说任何键名为user_*
的东西都会与用户相关联。这不是组织IMO对象的好方法。但是,当您使用user
密钥并将所有关联的数据粘贴在下面时,可以这么说,那么您可以拥有更清晰的顶层和真正的嵌套数据层次结构,而不是线性的。
答案 1 :(得分:3)
为什么不创建一个处理数据访问和存储的会话包装器类?这将产生更清晰的代码和抽象,因此对存储方法的更改非常简单。
以下是包装器的示例:
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;
生成更清晰的代码和更大的范围问题。
经过一段时间后,您可以创建一个新的驱动程序,用于存储在数据库中,然后只需将驱动程序从本机更改为数据库。
注意:在数据库中存储对象可能有点小问题,特别是如果您的代码没有被组织为在用户类在范围之前加载会话,那么您可以在会话中获得部分对象,这将导致缺乏功能。