PHP项目中的纯域驱动设计

时间:2016-01-05 15:52:03

标签: php symfony domain-driven-design onion-architecture

在“PHP World”中,任何DDD应用程序(示例)中的基础结构层都有一种奇怪的感觉。

我看到很多示例,当开发人员在基础架构层中使用Doctrine2时,使用域实体(来自域层)作为Doctrine2模型,将文档注释置于其上,或者在配置中提及它们( xml,yml)。 例如,Big Blue Book example,这是域实体所在的位置:https://github.com/codeliner/php-ddd-cargo-sample/tree/master/CargoBackend/src/Model,正如您所看到的,它与Doctrine(注释注释)高度耦合。是吗?

我觉得这是错误的方式。

我对DDD的理解是: 存储库应该对持久层进行查询并将结果传递给工厂以正确实例化Aggregate Root实体(域模型)。这意味着只有Factory知道如何实例化特定的Aggregate Root,而且还有一个所谓的实体lyfe循环。这意味着并非每次都应通过__construct实例化(水合)Domain实体。

如果我有正确的感觉,那么在类似DDD的应用程序中正确使用Doctrine2的好例子在哪里?

1 个答案:

答案 0 :(得分:3)

Tbh我不完全理解你的问题,但我会尽力回答。

域层中的ORM

ORM is best way to easily map your domain objects to your database layer.事实上,它使用您的域名模型并不会使其与您的聚合和实体相结合。 People are scared,他们需要拥有干净的域名图层,人们喜欢用xml,yml来映射他们的域名图层。我会说feel free to map it by annotations,如果你确定的话,you're not going to change orm framework in the future。这将有助于开发人员轻松改变映射。在PHP中你可以肯定,该学说将长期排在第一位,所以请随意使用它。

但要小心使用ActiveRecord,因为它真正将您与框架结合在一起。如果您不想使用ORM,则需要使用干净的SQL映射。如果你有复杂的域好运:))

不要害怕耦合

如果您感觉PHP lack features并且它们应该使用本机php构建,请随意在模型中直接使用它们。例如,我使用Doctrine ArrayCollection作为我的模型的一部分,因为,如果我将使用Java作为示例,我会直接在该语言中使用Collections类型。这只是PHP is retarded with some features,我们需要帮助它;)
框架相同,您可能会在域层中实现,例如百老汇用于事件采购。

不要打架你的框架

有时您会发现,您使用的框架(例如ORM)不会让您按照自己的意愿行事。你已经选择了框架,如果你不想改变它,不要对抗它。你需要接受它的所有优点和缺点。

阅读Vaughn Vernon的红皮书

我发现你不太了解积木。 工厂负责在生命周期开始时构建对象。 存储库负责保存状态并从数据库中检索它。 你应该先从红皮书开始,它有很多例子。我会称它为DDD初学者比Blue Book更友好。