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

时间:2011-11-20 13:38:15

标签: php design-patterns dao factory-pattern

我正在关注数据访问对象模式以及Factory(编辑:抱歉,如果我正在做noob错误)。

要登录用户,我目前正在执行:

$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_dao = UserDaoFactory::getUserDaoFactory()->getUserDao();
$user = $user_dao->userFromSession($_SESSION['id']);
if ($user->isLoggedIn()) {
    // success
}

我必须在每个我需要了解当前登录用户的地方这样做。

或尝试其他方法?

或者我应该将“给我一个登录用户模型的实例”抽象为像用户工厂这样的东西吗?

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

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();

3 个答案:

答案 0 :(得分:0)

我会将其封装到服务层中,仅使用该服务层并在那里解决一次。然后您可以在以后更改整个应用程序时进行更改。

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

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

因此,每个请求的一个User实例是我的选择。