0

アプリケーションのログイン部分で作業しているときに、次の問題に遭遇しました。

私のモデルは 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 から完全なドメイン駆動開発に移行し、データ アクセスをユーザー オブジェクトから分離します。次に、2 番目のマッパーを作成して、User オブジェクトをテーブル行ではなく stdClass で埋めます。

私の 2 つの質問: これらのうちどれをお勧めしますか? そして、私が見逃しているものはありますか?

これらのいずれかを実行してから、フレームワークに明らかな何かが欠けていることに気付くのは嫌です。これを行うための「適切な」方法があるかどうかは誰にもわかりませんか?

よろしく、サンダー

4

2 に答える 2

1

あなたが望むことをするための「適切な」方法はありません。あなたが示すアプローチはすべてうまくいくはずです。

個人的には、ユーザーの ID だけを Zend_Auth に保存することに賛成です。すべてのユーザーの詳細を含む完全なオブジェクトを保存すると、ユーザーが自分の情報を変更すると同期が取れなくなります。

プロジェクトで、ユーザーにコントローラーを提供するコントローラープラグインを作成したことがあります。基本的に、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 に答える