【问题标题】:Creating a model instance of a user based on an open session基于打开的会话创建用户的模型实例
【发布时间】:2012-01-02 08:44:59
【问题描述】:

我正在遵循数据访问对象模式以及工厂(编辑:抱歉,如果我犯了菜鸟错误)。

要登录用户,我目前这样做:

$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
}

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

或者试试这个其他的方法?

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

例如,将登录用户的实例存储在用户类的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();

【问题讨论】:

    标签: php design-patterns dao factory-pattern


    【解决方案1】:

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

    【讨论】:

    • 我只是好奇,为什么用户模型(或用户数据访问对象)不应该处理身份验证?这似乎是我认为“操纵用户对象”的一部分。
    【解决方案2】:

    我会将其封装到服务层中,仅使用该服务层并在那里解决一次。然后,您可以稍后在不更改整个应用程序的情况下更改它。

    【讨论】:

    • 您能否举例说明在这种情况下访问服务层的含义?
    • 只是围绕数据模型的一层。所以一个新的 User 对象有一个更简单的接口,并且在新的 User 对象中你可以处理你希望如何实现的细节。在您的应用程序代码中,您只能访问新的 User 对象,因此您将数据模型和会话逻辑分层。
    【解决方案3】:

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

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

    所以,每个请求一个用户实例是我的选择。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-10-20
      • 2021-06-19
      • 2011-02-26
      • 1970-01-01
      • 1970-01-01
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多