7

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

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

但是有一点对我来说很难理解:在 DDD 与 Doctrine 2 的几个代码示例中,域实体中的聚合是用 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;
    }
//...
}

对我来说,这个实现在领域模型和持久化服务Doctrine2 之间建立了高度耦合。

另一方面,如果 DDD Entity 和 Doctrine Entity 类是解耦的,我认为会有很多层/类。

你怎么看?有没有更好的方法来避免/处理这个?

4

1 回答 1

6

不要对使用ArrayCollections. 请注意,它位于 Doctrine/Common 命名空间中。它只是一个小实用程序数组包装器,与 Doctrine 持久层没有特别的联系。您可以轻松地将其替换为另一个数组类。

该手册解决了这个问题:https ://www.doctrine-project.org/projects/doctrine-orm/en/latest/reference/association-mapping.html#collections 。

就解耦而言,可以进行 DDD 建模,同时将自己限制在学说实体中。这是非常有限的,通常不鼓励。所以是的,你可能需要另一层。

很难证明 PHP 中纯 DDD 实现的开销是合理的。

于 2013-08-27T20:05:12.400 回答