【问题标题】:In Zend_Auth, can I get a domain-model User object instead of stdClass?在 Zend_Auth 中,我可以获得域模型用户对象而不是 stdClass 吗?
【发布时间】:2010-11-19 08:24:51
【问题描述】:

在处理应用程序的登录部分时,我发现自己遇到了一个问题:

我的模型基于 Active Record,通过扩展 Zend_Db_Table_Row 对象。每当我必须与用户打交道时,我都想通过 User 对象(作为扩展表行)来做到这一点。但是,Zend_Auth_Adapter_DbTable::getResultRowObject() 返回一个 stdClass,我找不到告诉 Zend_Auth_Adapter_DbTable 使用特定 Db_Table 的方法。

目前我发现的三个选项:

  1. 编写自定义 Zend_Auth_Adapter,以返回正确的类对象(内部使用 Zend_Db_Table)。

  2. 在身份验证之后执行一些 stdClass 的读取和一些 User 对象的写入 - 你可以创建一个 Zend_Db_Table_Row 类而不实际使用 Zend_Db_Table 来创建它吗?

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

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

我不想做这些,然后发现我在框架中遗漏了一些明显的东西。有谁知道是否有“正确”的方法可以做到这一点?

问候, 砂光机

【问题讨论】:

    标签: zend-framework activerecord domain-driven-design zend-db zend-auth


    【解决方案1】:

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

    我个人赞成在 Zend_Auth 中只为用户存储一个 ID - 如果你要存储一个包含所有用户详细信息的完整对象,如果用户要更改他们的信息,它将不同步。

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

    【讨论】:

      【解决方案2】:

      特别是,我使用解决方案 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 类。

      希望对你有帮助

      【讨论】:

        猜你喜欢
        • 2011-07-08
        • 2019-02-12
        • 2017-08-08
        • 1970-01-01
        • 1970-01-01
        • 2015-03-15
        • 2013-11-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多