2012-02-11 112 views
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進行迭代並讓它們自己存儲。