Php 保持DAO和域对象分离

Php 保持DAO和域对象分离,php,entity,domain-driven-design,dao,Php,Entity,Domain Driven Design,Dao,我有一个用户域对象类和一个UserDAO类。用户只关心它的状态,而UserDAO只关心数据存储。从我所读到的,他们不应该相互了解,也不应该相互关心 然后我想知道如何使用我的用户类来处理UserDAO,反之亦然。经过一些研究,我发现服务类应该将一系列相关的类耦合在一起,以实现交互(在我的例子中是User和UserDAO) 如果DAO不应该知道也不关心域对象,为什么我看到一些DAO接受它们对应的域对象作为参数,甚至返回它 class UserDAO { //other logic

我有一个用户域对象类和一个UserDAO类。用户只关心它的状态,而UserDAO只关心数据存储。从我所读到的,他们不应该相互了解,也不应该相互关心

然后我想知道如何使用我的用户类来处理UserDAO,反之亦然。经过一些研究,我发现服务类应该将一系列相关的类耦合在一起,以实现交互(在我的例子中是User和UserDAO)

如果DAO不应该知道也不关心域对象,为什么我看到一些DAO接受它们对应的域对象作为参数,甚至返回它

class UserDAO
{
    //other logic

    public function fetchById($id)
    {
        //user fetch logic

        return new User(...);
    }

    public function persist(User $user)
    {
        //user persist logic
    }

    //other logic
}

正确的处理方法是什么?有了上面的UserDAO,用户就很清楚了。

这里有点混乱

在DDD上下文中,Reposity模式比DAO对象更适合。您可以检查存储库和DAO之间的差异

存储库确实知道您的域对象,但您的域对象不知道存储库。这样做的原因是关注点分离和良好的分层

存储库通常是在某个应用程序级别的类中注入的。应用级别类的示例是处理用户请求的类,如控制器(mvc上下文)或Web服务


存储库也可以注入到域服务中,但域服务通常用于解决重要业务操作的问题,或用于不属于域上下文中唯一实体的操作。

从我所读的内容中,我了解到存储库可以使用DAO,但不能使用DAO。