【问题标题】:In Zend_Auth, can I get a domain-model User object instead of stdClass?在 Zend_Auth 中,我可以获得域模型用户对象而不是 stdClass 吗?
【发布时间】:2010-11-19 08:24:51
【问题描述】:
在处理应用程序的登录部分时,我发现自己遇到了一个问题:
我的模型基于 Active Record,通过扩展 Zend_Db_Table_Row 对象。每当我必须与用户打交道时,我都想通过 User 对象(作为扩展表行)来做到这一点。但是,Zend_Auth_Adapter_DbTable::getResultRowObject() 返回一个 stdClass,我找不到告诉 Zend_Auth_Adapter_DbTable 使用特定 Db_Table 的方法。
目前我发现的三个选项:
编写自定义 Zend_Auth_Adapter,以返回正确的类对象(内部使用 Zend_Db_Table)。
在身份验证之后执行一些 stdClass 的读取和一些 User 对象的写入 - 你可以创建一个 Zend_Db_Table_Row 类而不实际使用 Zend_Db_Table 来创建它吗?
从 Active Record 转移到完整的领域驱动开发,将我的数据访问与用户对象分离。然后编写第二个映射器,用 stdClass 而不是表格行填充 User 对象。
我的两个问题:您会推荐哪一个?有什么我遗漏的吗?
我不想做这些,然后发现我在框架中遗漏了一些明显的东西。有谁知道是否有“正确”的方法可以做到这一点?
问候,
砂光机
【问题讨论】:
标签:
zend-framework
activerecord
domain-driven-design
zend-db
zend-auth
【解决方案1】:
没有“正确”的方式来做你想做的事。您展示的方法应该都有效。
我个人赞成在 Zend_Auth 中只为用户存储一个 ID - 如果你要存储一个包含所有用户详细信息的完整对象,如果用户要更改他们的信息,它将不同步。
在一个项目中,我曾经编写了一个控制器插件,为用户提供控制器。它基本上从 Zend_Auth 中获取 ID 并基于它构建一个用户对象。如果没有 ID,它还会创建一个匿名用户对象。并不是说这是最好的方法,但它是透明且有效的。
【解决方案2】:
特别是,我使用解决方案 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 类。
希望对你有帮助