我遵循数据访问对象模式,以及工厂(编辑:抱歉,如果我做新手错误)。
登录一个用户,我现在这样做:
$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;
)