2015-10-14 82 views
1

我想在域驱动设计方法中使用Doctrine来实现数据持久性。但是困扰我的是关联映射应该在实体内部的事实。就纯DDD而言,这不是一个坏习惯吗?因为在进入持久性问题之前,我的域实体非常干净,现在他们在其属性中有很多评论。像这样:实体内的DDD和Doctrine映射

<?php 

namespace Domain\Model; 

use Doctrine\ORM\Mapping as ORM; 

/** 
* User 
* 
* @ORM\Table(name="user") 
* @ORM\Entity 
*/ 
class User 
{ 
    /** 
    * @ORM\Id 
    * @ORM\GeneratedValue(strategy="SEQUENCE") 
    * @ORM\SequenceGenerator(sequenceName="user_id_seq", allocationSize=1, initialValue=1) 
    * @ORM\Column(type="integer") 
    */ 
    private $id; 

    ... 

除了使用这些评论,我还必须有use Doctrine\ORM\Mapping as ORM;。这样,基础设施就不会与域保持分离。

有没有办法将这个映射移动到配置文件?我正在使用ZF2。

+5

学说2支持YAML和XML映射。只需搜索ZF2文档,了解如何在其框架中执行此操作。我使用Symfony 2,所以我不能给你具体细节,但我相信它可以完成。 – Cerad

+0

这工作!谢谢你的回答。我对Zend使用了这种方法:https://www.kerstner.at/en/2014/04/managing-doctrine-2-entity-model-classes-using-yamldriver-in-zend-framework-2/ –

回答

2

是的,这从DDD的角度来看是不好的。有两种解决方案:

  • 使用外部映射机制,例如@Cerad描述的机制。这样可以将域模型从持久性问题中解放出来,但是它也可能是一个难以管理的问题。毕竟,出于某种原因,许多项目都从基于XML的持久性配置中移除。

  • 创建单独的持久性模型。这个模型非常简单,根本不包含任何逻辑,只是数据。然后,创建一个映射器来映射这两者之间的映射。

+0

谢谢为了回答。我使用了@Cerad提供的第一个解决方案。关于第二种解决方案,我是否应该有2个代表用户的实体?一个用于域,另一个用于持久性? –

+0

@RodrigoOtavio是的,虽然我不会将持久对象称为实体以避免混淆。 – theDmi

0

洋葱架构已经回答你的问题,是推荐的建筑之一DDD方法。我保持域图层的想法只包含业务逻辑。 infrasctruture层将具有存储库。它是存储库的工作,用于保留在域对象中所做的更改。因此,如果您使用的是ORM,那么您应该维护您的映射。下面是关于如何在DDD实现库一great post,希望它能帮助,

https://codingcraft.wordpress.com/2015/10/12/implementing-repository-in-ddd-part-1/