Symfony Doctrine实体管理器和存储库

时间:2016-05-30 23:58:10

标签: doctrine-orm doctrine repository-pattern symfony repository-design

我了解好处或存储库模式,但我无法在Symfony3 Doctrine中了解Doctrine\ORM\EntityManager\Doctrine\ORM\EntityRepository

  1. 两者有什么区别?
  2. 是否应将存储库注入控制器或实体管理器?

    修改 正确的问题应该是:从控制器访问存储库的正确方法是什么?

    • 是否应将存储库作为服务注入控制器?
    • 是否应将存储库作为服务注入其他服务?
  3. 实体经理是否应该包含任何查询? 的修改 正确的问题应该是:服务是否应包含查询?其中@MateuszSip已经解释过,可以通过注入实体管理器来完成

  4. 是否应添加getAvailableManagers等自定义功能 存储库或服务? (其中manager是一个存储库 确定available manager

  5. 是一些逻辑
  6. 如果是findAllManager这样的更通用的函数,它应该在存储库还是实体管理器中呢?
  7. 目前我正在使用Symfony3。非常感谢你

    干杯,

    修改 和@MateuszSip(感谢队友)交谈,我决定用下面的例子让我的问题更加清晰。请注意,下面的代码并不代表真正的问题

    控制器

    Class ManagementController
    {
        public function assignManager($projectType)
        {
            // Grabbing a service
            $s = $this->get('mycompany_management_management_service')
    
            $managers = $s->findAvailableManagers();
            $managers = $s->checkCapability($managers, $projectType);
    
            return $managers
        }
    }
    

    存储库

    class ManagerRepository extends \Doctrine\ORM\EntityRepository
    {
        public function findAvailableManagers() 
        {
            ...
            return $managers
        }
    
        public function checkCapability($managers, $type)
        {
            ...
            return $capableManagers
        }
    }
    

    服务

    class ManagementService 
    {
       ... I am not sure what should be here.
    }
    

1 个答案:

答案 0 :(得分:2)

  1. EntityManager用于管理与学说相关的对象,因此:
    • 你可以坚持一个实体对象(它现在由学说管理,并准备保存)
    • 您可以删除实体对象(以便稍后删除)
    • 你可以刷新,它会触发待处理的操作
    • 您可以获取存储库(获取您需要的对象)或使用通用API通过主键获取对象 等
  2. 这是一个管理对象状态及其与数据库关系的类。

    存储库是一种标准化对访问者的访问的模式。

    1. 如果您的应用程序很复杂,您应该向控制器注入单独的服务。因此,有一个UserSaver服务(作为示例)使用entityManager使用UserRepository创建/更新用户和UserFinder(或名称很好的东西),UserRepository负责按定义的标准获取用户。

    2. 您可以使用实体管理器创建查询,但em本身不能包含查询。

    3. 在我看来,定义服务内部的方法,以及UserRepository中的相应方法。此时,您想要的所有内容都应该由数据库提取,但以后可能会更改。

    4. 在存储库中。方法如:findByRole(role = manager),findIsActive,findOneBySecurityNumber依赖于存储库。