【问题标题】:Using Doctrine's EntityManager in a repository design在存储库设计中使用 Doctrine 的 EntityManager
【发布时间】:2014-05-02 12:38:36
【问题描述】:

我正在尝试在我的 zend 框架 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,但我不知道该怎么做,感谢任何想法和反馈

【问题讨论】:

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


    【解决方案1】:

    当然,有几种方法可以做到这一点。您在 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
    {
    
    }
    

    【讨论】:

    • 如果我从 Entityrepository 扩展,我不需要做类似 $users = $em->getRepository('My\Model\User')->getAllUsers();在我的服务班?我希望我的服务类不知道它使用什么样的实现来从我的数据库中获取数据。
    • @DannyBiezen - 不是真的。您可以将服务类限制为使用 IUserRepository 接口中定义的方法。您利用 EntityRepository 来实现该接口的事实只是一个实现细节。
    猜你喜欢
    • 1970-01-01
    • 2011-08-15
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2011-08-04
    • 1970-01-01
    • 2018-05-26
    • 2015-04-24
    相关资源
    最近更新 更多