在MVC中设置存储库模式

时间:2012-02-11 22:29:37

标签: php oop design-patterns repository-pattern ddd-repositories

我正在试图弄清楚Repository模式如何工作以及如何在自定义MVC模式中实现它。

据我了解,Repository是一个简单地从实体类返回数据或将实体类保存到持久层的层。

现在我现在看到这样:

请求进入我的控制器以创建用户。只是一个用户名和密码。我的控制器将执行以下操作:

function CreateAction ( )
{
    $userRepo = new userRepository ( );
    $user = new userEntity ( );

    $user->setUsername('user');
    $user->setPassword('123456');

    $userRepo->create($user);
}

然后我的 userRepository 类看起来像这样:

class userRepository
{
    public function create ( User $user )
    {
        $this->db->exec ( "INSERT INTO ... QUERY TO SAVE THE USER" );
    }
}

我的 userEntity 类看起来像这样:

class userEntity
{
    private $username;
    private $password;

    public function setUsername ( $username )
    {
        $this->username = $username;
    }

    public function getUsername ( )
    {
        return $this->username;
    }

    public function setPassword ( $password )
    {
        $this->password = $password;
    }

    public function getPassword ( )
    {
        return $this->password;
    }
}

现在我认为第一件事是错误的是我在存储库类中使用了一个查询。我在哪里实际将userEntity类保存到数据库?换句话说,我在哪里执行实际的SQL查询?我想正确的方法是在存储库的'create'方法中调用DAO。但我仍然试图弄清楚DAO的真实外观以及与MVC模式中的“模型”相比有多么不同。

但除此之外,这是实现存储库模式的正确方法吗?

2 个答案:

答案 0 :(得分:12)

您的存储库对我来说看起来更像是一个TableDataGateway。存储库的想法是在映射层之上的另一层,它在域对象和数据库之间进行调解。它还可以作为域对象的内存存储(您的示例中缺少某些内容),并且可以封装Factory以创建新实体。它们通常还允许按规范模式查询存储库:

Repository Sequence Diagram from POEAA

这是一个相当复杂的模式。你可以在

中找到关于Repository的好文章

同时检查Good Domain Driven Design samples

答案 1 :(得分:0)

是的,这是Repository模式的正确实现。 DAO模式通常也很有用,但是您的实现没有任何问题。

DAO是一种简单的模式,它将持久性逻辑与业务逻辑分开。它会创建CRUD操作,而您的实体将包含业务逻辑的方法,因此它将持久性的责任与您的域分开。我通常为单个实体和聚合的存储库寻找DAO,允许我做像productCatalogRepository.Update()这样的事情,然后它会迭代产品DAO并让它们自己存储。