在Zend_Auth中,我可以获得域模型User对象而不是stdClass吗?

时间:2009-08-13 15:22:47

标签: zend-framework activerecord domain-driven-design zend-db zend-auth

在处理应用程序的登录部分时,我发现自己遇到了一个问题:

我的模型基于Active Record,扩展了Zend_Db_Table_Row对象。每当我必须处理用户时,我想通过User对象(作为扩展表行)来做这件事。但是,Zend_Auth_Adapter_DbTable :: getResultRowObject()返回一个stdClass,我找不到告诉Zend_Auth_Adapter_DbTable使用特定Db_Table的方法。

到目前为止,我找到了三个选项:

  1. 编写自定义Zend_Auth_Adapter,以返回正确的类对象(在内部使用Zend_Db_Table)。

  2. 认证后执行一些stdClass的读取和一些User对象的编写 - 你能不创建Zend_Db_Table_Row类而不实际使用Zend_Db_Table来创建它?

  3. 从Active Record转移到完整的Domain Driven开发,将我的数据访问与用户对象分开。然后编写第二个映射器,用stdClass而不是表行填充User对象。

  4. 我的两个问题:你会推荐哪一个?有什么我想念的吗?

    我讨厌做任何这些,然后发现我遗漏了框架中明显的东西。有谁知道是否有“正确”的方式来做这件事?

    此致 桑德

2 个答案:

答案 0 :(得分:1)

没有“正确”的方式来做你想做的事。你展示的方法都应该有效。

就我个人而言,我赞成在Zend_Auth中只为用户存储一个ID - 如果你要存储一个包含所有用户详细信息的完整对象,那么如果用户要更改他们的信息,它就会失去同步。

在一个项目中,我曾经写过一个控制器插件,它将用户提供给控制器。它基本上从Zend_Auth获取了ID,并基于它构建了一个用户对象。它还创建了一个匿名用户对象,以防没有ID。不是说这是最好的方法,但它是透明的并且有效。

答案 1 :(得分:0)

特别是,我使用解决方案2,我有一个包装Zend_Auth的自定义Auth对象,所以在登录时,我有这个:

public function login($user, $password) {
    if(!($this->adapter instanceof Zend_Auth_Adapter_DbTable)) {
        throw new Gecko_Auth_Exception("The Adapter is not valid or not initialized");
    }

    $auth = Zend_Auth::getInstance();

    $this->adapter->setIdentity($user);
    $this->adapter->setCredential($password);

    $result = $auth->authenticate($this->adapter);
    if( $result->isValid() ) {
        $data = $this->adapter->getResultRowObject(null, $this->passwordColumn);
        $userObject = new self::$userClass($data);
        $auth->getStorage()->write($userObject);
        return true;
    } else {
        return false;
    }
}

然后我可以调用Zend_Auth :: getInstance来检索自定义的UserClass对象,这样我就可以将它映射到我的自定义Zend_Db_Table_Row类。

希望有所帮助