0

在應用程序的登錄部分工作時,我發現自己遇到了一個問題:在Zend_Auth中,我可以獲取域模型User對象而不是stdClass嗎?

我的模型基於Active Record,擴展了Zend_Db_Table_Row對象。每當我必須處理一個用戶,我想通過用戶對象(是一個擴展的錶行)來做到這一點。然而,Zend_Auth_Adapter_DbTable :: getResultRowObject()返回一個stdClass,我找不到一種方式告訴Zend_Auth_Adapter_DbTable使用特定的Db_Table。我已經發現迄今

我的三個選項:

  1. 編寫自定義Zend_Auth_Adapter,返回正確的類對象(使用內部的Zend_Db_Table)。

  2. 認證後執行stdClass的一些閱讀和一些用戶對象的寫作 - 你可以創建一個Zend_Db_Table_Row類而不用實際使用Zend_Db_Table來創建它嗎?

  3. 從Active Record轉移到完全的Domain Driven開發,將我的數據訪問從用戶對象中分離出來。然後編寫第二個映射器,用stdClass而不是表格行填充User對象。

我的兩個問題:你會推薦哪些?還有什麼我失蹤?

我不想做任何這些,然後發現我錯過了框架中明顯的東西。有誰知道是否有一個「適當」的方式來做到這一點?

問候, 桑德

回答

1

有沒有「正確」的方式來做你想做的。你展示的方法應該都可以工作。

就我個人而言,我贊成只在Zend_Auth中存儲用戶的ID - 如果要存儲具有所有用戶詳細信息的完整對象,那麼如果用戶要更改其信息,它將不會同步。

在一個項目中,我曾經寫過一個控制器插件,它將用戶提供給控制器。它基本上從Zend_Auth獲取ID並基於它建立了一個用戶對象。它還創建了一個匿名用戶對象,以防沒有ID。並不是說這是最好的方法,但它是透明的並且有效。

0

在particullar,我使用的解決方案編號2,I有一個封裝Zend_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類。

希望它有幫助

相關問題