Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 基于打开的会话创建用户的模型实例_Php_Design Patterns_Dao_Factory Pattern - Fatal编程技术网

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

Php 基于打开的会话创建用户的模型实例,php,design-patterns,dao,factory-pattern,Php,Design Patterns,Dao,Factory Pattern,我遵循的是数据访问对象模式以及Factory(编辑:如果我犯了noob错误,请道歉) 要登录用户,我当前执行以下操作: 我的问题是后续页面。考虑到用户实际上已经登录,我应该如何创建和访问他们的用户模型的实例 要获取登录用户的实例,我应该执行以下操作吗 要继续下一页的会话,我是否应该尝试以下操作? 我必须在每个我需要了解当前登录用户的地方这样做 还是尝试另一种方法? 或者我应该将“给我一个登录用户模型的实例”抽象为用户工厂之类的东西吗 例如,将登录用户的实例存储在用户类的私有静态属性中 class

我遵循的是数据访问对象模式以及Factory(编辑:如果我犯了noob错误,请道歉)

要登录用户,我当前执行以下操作: 我的问题是后续页面。考虑到用户实际上已经登录,我应该如何创建和访问他们的用户模型的实例

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

要继续下一页的会话,我是否应该尝试以下操作? 我必须在每个我需要了解当前登录用户的地方这样做

还是尝试另一种方法? 或者我应该将“给我一个登录用户模型的实例”抽象为用户工厂之类的东西吗

例如,将登录用户的实例存储在用户类的
私有静态
属性中

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框架很好地实现了这一点-查看此链接只是为了获得一个基本想法:

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

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


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

您能举例说明在这种情况下访问服务层是什么意思吗?只是围绕数据模型的一层。因此,一个新的用户对象有一个更简单的界面,在这个新的用户对象中,您将处理您希望如何实现事情的细节。在您的应用程序代码中,您只访问新的用户对象,因此您将数据模型和会话逻辑分层,远离它。我只是好奇,为什么用户模型(或用户数据访问对象)不应该处理身份验证?这似乎是我认为“操纵用户对象”的一部分。
$user_dao = UserDaoFactory::getUserDaoFactory()->getUserDao();
$user = $user_dao->userFromSession($_SESSION['id']);
if ($user->isLoggedIn()) {
    // success
}
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();