在存储库设计中使用Doctrine的EntityManager

时间:2014-05-02 12:38:36

标签: php doctrine-orm zend-framework2 repository-pattern

我试图在我的zend framework 2应用程序中实现一个存储库模式。我已经提供了服务

<?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));
}
}

我的问题是我使用Doctrine作为Orm并且我想在我的存储库中使用entitymanager但是我不知道如何做到这一点,任何想法和反馈都表示赞赏

1 个答案:

答案 0 :(得分:0)

当然,有几种方法可以做到这一点。您在ZF2 / D2项目中执行此类操作的典型方式是从DoctrineORMModule开始。

该模块以各种方便的方式通过ZF2服务管理器公开Doctrine的EntityManager(您可以通过$ sm-&gt; get(&#39; doctrine.entitymanager.orm_default&#39;)来明确获取EM实例)。

一旦你可以从SM获得实体管理员,就可以为你的存储库编写一个工厂,然后注入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
{

}