在处理应用程序的登录部分时,我发现自己遇到了一个问题:
我的模型基于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转移到完整的Domain Driven开发,将我的数据访问与用户对象分开。然后编写第二个映射器,用stdClass而不是表行填充User对象。
我的两个问题:你会推荐哪一个?有什么我想念的吗?
我讨厌做任何这些,然后发现我遗漏了框架中明显的东西。有谁知道是否有“正确”的方式来做这件事?
此致 桑德
答案 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类。
希望有所帮助