【问题标题】:ZF + Doctrine 2 : Heavy model classes or Lightweight model + Service layer?ZF + Doctrine 2:重模型类还是轻量模型 + 服务层?
【发布时间】:2011-05-01 17:55:40
【问题描述】:

我正在集成 Zend FrameworkDoctrine 2,并且正在发现 Service 层

现在我明白(我错了吗?)我有两种可能的架构:

  • 模型,其中类包含领域逻辑,即属性 + getter/setter + 复杂方法
  • 轻量级模型,其中类包含属性 + getter/setter 和 Service 层,包含域逻辑和修改模型类

各有什么优缺点?

通过将域逻辑置于模型外部而失去 OOP 对我来说似乎很奇怪,所以我不明白为什么要使用服务层。

【问题讨论】:

  • 总是有超过 2 种可能的架构

标签: php zend-framework architecture doctrine-orm service-layer


【解决方案1】:

是什么让您认为您的服务层对于您的模型是外部的?它不是。事实上,它是模型的核心部分,还有实体、存储库等。

如果您使用 Doctine2,您将需要一个服务层。一个原因是您不希望您的实体知道 EntityManager(损害可测试性)。另一个是您也不希望您的控制器驱动 EM(了解持久性不是控制器的工作)。

我通常使用一种架构,其中服务层是控制器与模型的接口。服务层公开了对实体进行操作的函数(将它们作为参数,或返回它们,或两者兼而有之)。实体的持久性被服务层隐藏。服务类可以自己驱动 EM 和存储库,或者将其委托给控制器永远不会知道存在的其他代码。

因此,服务层提供了控制器可以用来操作您的业务数据的 API。

【讨论】:

  • 伟大而清晰的答案谢谢,虽然我很难理解为什么失去 OOP... 我的意思是我认为 $user->generatePassword()$userService->generatePassword($user) 更好 因为方法适用于用户,它不是应用于参数的“函数”......这就是我所说的“外部”。对我来说,这类似于 OOP(对象和对象上的方法)和函数编程之间的区别。有了服务层,对象就只是一个数据容器……
  • @matthieu 如果您的generatedPassword() 方法只生成一个随机字符串,那么在您的实体中使用该方法就可以了;它不会造成任何外部的、持久性相关的依赖。
  • @matthieu - 实体的 are 数据容器 - 它们只是“花哨”(因为它们可以有方法来操作或报告其内部状态)。 generatePassword() 可能没问题——只要它不依赖于一些外部的东西。例如,如果 generatePassword() 只生成 8 个随机字符,并将该字符串分配给 $this->password (或将其传递给 $this->setPassword() 然后适当地散列它),那很好。没关系,因为它只影响用户的密码,而不会影响其他任何东西。现在,如果您想通过电子邮件向用户发送他们的新密码,您应该这样做
  • 或带有评论线程的外部博客文章,以便其他人(如我、提示、提示)可以从交流中受益。我对这个讨论很感兴趣。 ;-)
  • @Cobby - 没错。更具体地说,没关系,因为这些功能没有外部副作用。至少在我的项目中,我不允许实体做诸如发送电子邮件之类的事情。事实上,我可能不允许他们直接访问外部只读 API。
猜你喜欢
  • 1970-01-01
  • 2023-04-07
  • 1970-01-01
  • 1970-01-01
  • 2021-02-27
  • 1970-01-01
  • 2014-05-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多