代码之家  ›  专栏  ›  技术社区  ›  kander

在Zend_Auth中,我可以获得域模型用户对象而不是stdClass吗?

  •  0
  • kander  · 技术社区  · 17 年前

    我的模型基于活动记录,通过扩展Zend_Db_Table_Row对象。每当我必须处理用户时,我都希望通过用户对象(作为扩展表行)来处理。但是,Zend_Auth_Adapter_DbTable::getResultRowObject()返回一个stdClass,我找不到方法告诉Zend_Auth_Adapter_DbTable使用特定的Db_表。

    到目前为止,我找到了三个选择:

    1. 在身份验证之后,执行stdClass的一些读取和用户对象的一些写入-您是否可以创建Zend_Db_Table_Row类而不实际使用Zend_Db_Table来创建它?

    2. 从活动记录转移到完整的域驱动开发,将我的数据访问与用户对象分离。然后编写第二个映射器,用stdClass而不是表行填充用户对象。

    我的两个问题:你会推荐哪一个?还有什么是我遗漏的吗?

    砂光机

    2 回复  |  直到 17 年前
        1
  •  1
  •   Jani Hartikainen    17 年前

    没有“正确”的方法来做你想做的事。你展示的方法应该都有效。

    在一个项目中,我曾经编写了一个控制器插件,为用户提供控制器。它基本上从Zend_Auth获取ID并基于它构建用户对象。它还创建了一个匿名用户对象,以防没有ID。并没有说这是最好的方法,但它是透明的,并且有效。

        2
  •  0
  •   Chris    17 年前

    特别是,我使用解决方案2,我有一个自定义的Auth对象,它包装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类。