0

アプリケーションのログイン部分で作業しているうちに、問題が発生しています。Zend_Authでは、stdClassではなくドメインモデルのUserオブジェクトを取得できますか?

私のモデルはActive Recordをベースにしており、Zend_Db_Table_Rowオブジェクトを拡張しています。私はユーザーと対処する必要があるときは、Userオブジェクト(拡張テーブル行)を使用してこれを実行したいと思います。しかし、Zend_Auth_Adapter_DbTable :: getResultRowObject()はstdClassを返し、Zend_Auth_Adapter_DbTableに特定のDb_Tableを使用するよう指示します。私がこれまでに見つけた

私の3つのオプション:

  1. は、適切なクラスのオブジェクトを返すために、カスタムZend_Auth_Adapterを書く(使用Zend_Db_Tableが内部的に)。

  2. 認証後、stdClassの一部の読み取りとUserオブジェクトの書き込みを実行します。実際にZend_Db_Tableを使用しないでZend_Db_Table_Rowクラスを作成できますか?

  3. Active Recordから完全なDomain Driven開発に移行し、データアクセスをユーザーオブジェクトから分離します。次に、テーブル行ではなくstdClassを使用してUserオブジェクトを塗りつぶす2つ目のマッパーを作成します。

私の2つの質問:どちらがお勧めですか?私には何かがありますか?

私はこれらのいずれかをして、フレームワークで何かが明白でないことが分かりません。これを行うための「適切な」方法があるかどうか誰にも知られていますか?ログイン時に、私はこれを持っているので、

よろしく、particullarで サンダー

答えて

1

「適切な」方法はありません。あなたが示すアプローチはすべて機能するはずです。

個人的に私はZend_AuthにユーザーのIDだけを格納したいと思っています。すべてのユーザーの詳細を含む完全なオブジェクトを保存する場合、ユーザーが情報を変更すると同期が外れることになります。

私はかつて、ユーザーにコントローラを提供したコントローラプラグインを作成しました。基本的にZend_AuthからIDを取得し、それに基づいてユーザオブジェクトを構築しました。また、IDがない場合に備えて匿名ユーザオブジェクトを作成しました。これが最良のアプローチだとは言いませんが、それは透明で働いています。

0

は、私は解決策番号2を使用し、私は、に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クラスにマップすることができます。

希望します。