使用对象与常规变量在会话中存储用户信息

时间:2011-01-04 01:46:47

标签: php session authentication object

我正在为我的网站实施用户身份验证系统。我正在使用一个开源库,通过创建一个User对象并将该对象存储在我的php SESSION变量中来维护用户信息。这是存储和访问该信息的最佳方式吗?

我发现访问用户变量有点麻烦,因为我必须首先创建一个对象来访问它们:

$userObj = $_SESSION['userObject'];
$userObj->userId;

而不是像这样只访问用户ID,我通常会存储用户ID:

$_SESSION['userId'];

将一堆用户数据存储为对象而不是仅将它们存储为单独的SESSION变量是否有优势?

ps - 该库似乎也在用户对象(id,用户名,加入日期,电子邮件,最后一个用户数据库查询)中存储了一些变量,但我真的不在乎将所有信息存储在我的会话中。我只想保留用户ID和用户名。

2 个答案:

答案 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;

生成更清晰的代码和更大的范围问题。

经过一段时间后,您可以创建一个新的驱动程序,用于存储在数据库中,然后只需将驱动程序从本机更改为数据库。

注意:在数据库中存储对象可能有点小问题,特别是如果您的代码没有被组织为在用户类在范围之前加载会话,那么您可以在会话中获得部分对象,这将导致缺乏功能。