Php 使用条令';存储库设计中的EntityManager

Php 使用条令';存储库设计中的EntityManager,php,doctrine-orm,zend-framework2,repository-pattern,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 ->

我正试图在我的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 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,但我不知道如何做到这一点,任何想法和反馈都是值得赞赏的。当然,有几种方法可以做到这一点。在ZF2/D2项目中执行此类操作的典型方式是从开始

该模块通过ZF2服务管理器以多种方便的方式公开了Doctrine的EntityManager(您可以$sm->get('Doctrine.EntityManager.orm_default')来显式获取EM实例)

一旦可以从SM获得entitymanager,就可以为存储库编写一个工厂,并注入EM


也就是说,有一个更干净的方法。条令具有对存储库的内置支持,您可以

然后,您的存储库将如下所示:

<?php
use Doctrine\ORM\EntityRepository;

class UserRepository extends EntityRepository implements IUserRepository {


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

// ...
}

如果我从Entityrepository进行扩展,我不需要像$users=$em->getRepository('My\Model\User')->getAllUsers()这样做;在我的服务课上?我希望我的服务类不知道它使用什么样的实现从我的数据库中获取数据。@DannyBiezen-不太清楚。您可以将服务类限制为使用IUserRepository接口中定义的方法。利用EntityRepository实现该接口只是一个实现细节。
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));
}
}
<?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
{

}