基于打开的会话创建用户的模型实例


Creating a model instance of a user based on an open session

我遵循数据访问对象模式,以及工厂(编辑:抱歉,如果我做新手错误)。

登录一个用户,我现在这样做:

$user_dao = UserDaoFactory::getUserDaoFactory()->getUserDao();
$user = $user_dao->create($_POST['email'], $_POST['password']);
if ($user_dao->authenticate($user))
{
    $user_dao->login($user); // sets $_SESSION['id']
}

我的问题是后续页。假设用户实际上已登录,我应该如何创建和访问其user模型的实例?

要获取已登录用户的实例,我应该执行以下操作吗?

要在下一页继续会话,我应该尝试以下操作吗?

$user_dao = UserDaoFactory::getUserDaoFactory()->getUserDao();
$user = $user_dao->userFromSession($_SESSION['id']);
if ($user->isLoggedIn()) {
    // success
}

我必须在每个需要了解当前登录用户的地方执行此操作。

或者试试其他方法?

或者我应该抽象"给我一个登录用户模型的实例"吗?变成用户工厂之类的东西?

例如,在User类的private static属性中存储登录User的实例?

class User {
    /* ... */
    private static $_logged_in_user;
    
    public static function setUserLoggedIn(User $user)
    {
        self::$_logged_in_user = $user;
    }
    
    public static function getLoggedInUser() {
        if (!self::$_logged_in_user)
    {
        self::$_logged_in_user = new self;
    }
    return self::$_logged_in_user;
    }
    /* ... */
}
$user = User::getLoggedInUser();

您应该创建一个单独的类用于授权目的,登录方法不应该属于用户模型。Kohana框架很好地实现了这一点—查看这个链接以获得一个基本的概念:http://kohanaframework.org/3.2/guide/api/Auth。

我会将其封装到一个服务层中,只使用该服务层并在其中解决一次问题。然后你可以稍后更改它,而不必更改整个应用程序。

我认为用户DAO只需要一次:当您对用户进行身份验证并获取他的个人信息(如姓名或角色)时。之后,您可以将此数据存储在会话中,并在每个新请求期间恢复它以供您使用。

对于isLogged()函数,我更喜欢使用封装在User类中的一些逻辑,而不是再次保存User类本身的实例(例如您示例中的private static $_logged_in_user; )