我正在关注数据访问对象模式以及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();
答案 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实例是我的选择。