DDD,Doctrine2,Aggregates和ArrayCollection:如何隔离域模型?

Kor*_*nik 5 domain-driven-design domain-model doctrine-orm

我正在尝试在具有大量业务逻辑的项目上有效地使用DDDDoctrine2

这对我来说是很新的,我正在阅读许多文章和代码示例,以了解DDD的主要原理和实践。

我知道我们需要将域对象与与系统相关的其他概念分离,即在分层体系结构中,“域层”必须与其他层隔离,例如持久层/服务(Doctrine2对我来说)。

但是有一件事对我来说很难理解:在带有doctrine2的ddd的几个代码示例中,域实体中的聚合是使用Doctrine ArrayCollection管理的,我发现了这种代码:

namespace Acme\Domain\Model\Users;

use Doctrine\Common\Collections\ArrayCollection;

class User{

     //...

    /**
    * Collection of Roles
    *
    * @var Collection of Roles
    */
    protected $roles;

    /**
    * Constructor.
    */
    public function __construct()
    {
        $this->createdAt = new \DateTime();
        $this->roles = new ArrayCollection();
    }

    public function getRoles()
    {        
        return $this->roles;
    }
//...
}
Run Code Online (Sandbox Code Playgroud)

对我而言,此实现在域模型和持久性服务 Doctrine2 之间建立了高度的耦合

另一方面,如果我认为DDD实体和Doctrine实体类是分离的,那么层/类将很多。你怎么看 ?有更好的方法来避免/处理此问题吗?

Cer*_*rad 5

不要对使用ArrayCollections感到震惊。注意,它在Doctrine / Common名称空间中。它只是一个实用程序数组包装程序,与Doctrine持久层没有特殊联系。您可以轻松地用另一个数组类替换它。

手册解决了这个问题:http : //docs.doctrine-project.org/en/latest/reference/association-mapping.html#collections。向下滚动到:5.12。馆藏

就去耦而言,可以进行DDD建模,同时将自己限制在理论实体的范围内。这是非常有限的,通常不鼓励使用。是的,您可能需要另外一层。

很难证明php中纯DDD实现的开销。