2014-05-02 36 views
0

我想在我的zend框架2應用程序中實現存儲庫模式。我已經作出了服務在存儲庫設計中使用Doctrine的EntityManager

<?php 
class UserService { 

private $userRepository; 
public function __construct(IUserRepository $repo) { 
    $this -> userRepository = $repo; 
} 

public function createUser($params) { 
    $this -> userRepository -> create($params); 
} 

public function findAllUsers() { 
    return $this -> userRepository -> getAllUsers(); 
} 
} 

其具有實現的接口

class UserRepository implements IUserRepository { 

public function getAllUsers() { 
    //return all users 
} 

public function getUserById($id) { 

} 
public function getOneUser($params){ 

} 
public function getUsers($params){ 

} 
public function create($params){ 

} 
public function update($params){ 

} 
public function delete($params){ 

} 
} 


<?php 
interface IUserRepository { 

public function getAllUsers(); 
public function getUserById($id); 
public function getOneUser($params); 
public function getUsers($params); 
public function create($params); 
public function update($params); 
public function delete($params); 

} 

在我module.php我使用依賴注入來確定我注入到一個控制器,倉庫的倉庫

public function getControllerConfig() { 
    return array('factories' => array(
     'My\Controller\Accounts' => function(){ 
      return new AccountsController(new UserRepository()); 
     }, 
    ), 
    ); 
} 

在我的控制器中,我將存儲庫傳遞給我的服務

class AccountsController extends AbstractActionController { 

private $service; 
public function __construct(IUserRepository $repo) { 
    $this->service = new UserService($repo); 
} 
public function indexAction() { 
    $all_users = $this->service->findAllUsers(); 
    return new ViewModel(array('users' => $all_users)); 
} 
} 

我的問題是,我使用學說的ORM和我想使用EntityManager在我的倉庫,但我不知道該怎麼做,任何想法和反饋的讚賞

回答

0

有幾種方法當然要做到這一點。在ZF2/D2項目中做這種事情的典型方法是從DoctrineORMModule開始。

該模塊通過ZF2服務管理器以各種方便的方式顯示Doctrine的EntityManager(您可以通過$ sm-> get('doctrine.entitymanager.orm_default')顯式獲取EM實例)。

一旦你可以從SM獲得你的entitymanager,你爲你的倉庫編寫一個工廠,並注入EM。


這就是說,有一個更清潔的方法。 Doctrine內置了對存儲庫的支持,您可以使用extend the default implementation。然後

你的倉庫應該是這樣的:

<?php 
use Doctrine\ORM\EntityRepository; 

class UserRepository extends EntityRepository implements IUserRepository { 


public function getAllUsers() { 
    return $this->findAll(); 
} 

// ... 
} 

只記得庫類添加到用戶實體的元數據。例如,與註釋:

/** 
* @ORM\Entity(repositoryClass="MyDomain\Model\UserRepository") 
*/ 
class User 
{ 

} 
+0

如果我從Entityrepository延長不會我要做像$用戶= $ EM-> getRepository(「我的\型號\用戶」) - > getAllUsers() ;在我的服務班?我希望我的服務類不知道它使用什麼類型的實現從我的數據庫獲取數據。 – DannyBiezen

+0

@DannyBiezen - 不是。您可以將您的服務類限制爲使用IUserRepository接口中定義的方法。您利用EntityRepository實現該接口的事實只是一個實現細節。 – timdev