9

我想知道存储库模式如何工作以及如何在自定义MVC模式中实现它。在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模式中的Model有何不同。

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

+4

对我来说看起来不错。存储库是sql的正确位置。可能想看看Doctrine2 ORM手册仅仅是为了想法。 – Cerad 2012-02-11 22:37:20

回答

12

Your Repository更像我的TableDataGateway。存储库的思想是在域对象和数据库之间进行中介的映射层之上的另一层。它也可以作为域对象的内存存储(你的例子中缺少的东西),并可以封装一个Factory来创建新的实体。他们通常还允许通过规范方式查询信息库:

Repository Sequence Diagram from POEAA

这是一个相当复杂的图案。您可以找到有关存储库好写起坐在

还要检查Good Domain Driven Design samples

0

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

DAO是一种简单的模式,它将持久性逻辑与业务逻辑分开。它会创建CRUD操作,而您的实体将包含业务逻辑的方法,因此它将持久性的责任从您的域中分离出来。我通常会为DAO获取单个实体和存储库以进行聚合,从而允许我执行诸如productCatalogRepository.Update()之类的操作,这会反过来对产品DAO进行迭代并让它们自己存储。