在“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
的好例子在哪里?
答案 0 :(得分:3)
Tbh我不完全理解你的问题,但我会尽力回答。
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)不会让您按照自己的意愿行事。你已经选择了框架,如果你不想改变它,不要对抗它。你需要接受它的所有优点和缺点。
我发现你不太了解积木。 工厂负责在生命周期开始时构建对象。 存储库负责保存状态并从数据库中检索它。 你应该先从红皮书开始,它有很多例子。我会称它为DDD初学者比Blue Book更友好。