0

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

我的模型基于 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 转移到完整的领域驱动开发,将我的数据访问与用户对象分离。然后编写第二个映射器,用 stdClass 而不是表行填充 User 对象。

我的两个问题:您会推荐哪些?有什么我想念的吗?

我不想做任何这些,然后发现我在框架中遗漏了一些明显的东西。有谁知道是否有“正确”的方法可以做到这一点?

问候, 桑德

4

2 回答 2

1

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

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

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

于 2009-08-13T20:28:32.530 回答
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 类。

希望能帮助到你

于 2009-08-13T20:18:12.493 回答