实体内的DDD和Doctrine映射

时间:2015-10-14 14:01:15

标签: php zend-framework2 doctrine domain-driven-design

我想在域驱动设计方法中使用Doctrine进行数据持久化。但令我困扰的是,关联映射应该在实体内部。对于纯DDD而言,这不是一个坏习惯吗?因为在我遇到持久性问题之前,我的域实体非常干净,现在它们的属性中有很多注释。像这样:

<?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。

2 个答案:

答案 0 :(得分:3)

是的,从DDD的角度来看这很糟糕。有两种解决方案:

  • 使用外部映射机制,例如@Cerad描述的机制。这使域模型免于持久性问题,但管理也可能很痛苦。毕竟,许多项目都摆脱了基于XML的持久性配置。

  • 创建单独的持久性模型。这个模型很简单,根本就没有逻辑,只包含数据。然后,创建一个映射器以在两者之间进行映射。

答案 1 :(得分:0)

洋葱架构可以解答您的问题,是DDD推荐的架构方法之一。我保留域层的想法只包含业务逻辑。 infrasctruture层将拥有存储库。存储库的工作是持久保存域对象中所做的更改。因此,如果您正在使用ORM,那么这是您应该维护映射的层。这里有关于如何在DDD中实现Repository的great post,希望它有所帮助,

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