代码之家  ›  专栏  ›  技术社区  ›  Noah Goodrich

如何使用Zend框架正确创建域?

  •  9
  • Noah Goodrich  · 技术社区  · 16 年前

    我问 this question 前一段时间,但现在我正在寻找实现我的数据库访问层和域层之间的实际分离。我还将致力于将业务逻辑移入它所属的域,并从控制器脚本中移出。

    我使用的是Zend框架,它为数据访问层实现了表数据网关和行数据网关模式,但是它显然没有真正定义如何构建与数据访问层分离的域层。我考虑过使用一个活动记录模式,其中域逻辑与数据访问逻辑共存,但我至少有一次遇到以下情况,我认为活动记录无法处理:

    我有一个表“person”,其中包含person_id和usertype字段。

    每个用户类型(admin、buyer、associate、supervisor)都有与之相关联的特定业务逻辑,并且所有类型都从Person对象继承一些基本功能。

    我不想使用专门属于一种用户类型的业务逻辑来膨胀行数据网关对象,但是我不确定如何构造域层来表示不同类型的用户。例如,我是创建一个包含PersonGateway对象的Person对象,然后编写包装函数来传递对网关对象的调用,还是编写Person对象来扩展PersonGateway对象,然后只实现我需要的特定功能?

    同样,我通常认为这(部分)是一个工厂问题,我需要一个工厂方法,它将根据用户类型实例化正确的子类。对于Zend框架的Zend_DB类,这仍然是最好的方法吗?

    任何关于如何在Zend_DB上正确创建域模型的建议或教程链接都将非常感谢。

    1 回复  |  直到 14 年前
        1
  •  16
  •   Bill Karwin    16 年前

    域模型不扩展任何内容。它们只是用来封装业务逻辑的普通类。他们可能 使用 数据访问对象,因此 protected 类内的行数据网关对象的实例。一 Row 对象通常比 Table 对象。另外,你总是可以得到 对象与 getTable() 方法。

    通常,dm类具有一个接口,该接口具有与您可以使用该类执行的更高级别操作相对应的方法。但您不一定希望公开所有数据访问操作。

    class Person {
      // Zend_Db_Table_Row object
      protected $data; 
    
      public function subscribeToService(Service $service) { ... }
    
      public function sendMailTo(Person $recipient) { ... }
    
      public function changePassword($newPassword) { ... }
    }
    

    我最后也写了关于这个主题的博客 spring 并写在ZF邮件列表上 recently .

    至于教程和资源,请尝试 http://domaindrivendesign.org/