我试图在我的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但是我不知道如何做到这一点,任何想法和反馈都表示赞赏
答案 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
{
}