Symfony Doctrine 实体管理器和存储库

Don*_*joe 6 doctrine repository-design repository-pattern symfony doctrine-orm

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

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

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

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

  4. 是否应该将自定义功能getAvailableManagers放在存储库或服务中?(manager存储库在哪里,确定有一些逻辑available manager

  5. 一个更通用的函数怎么样findAllManager,它应该在存储库还是实体管理器中?

目前我正在使用 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
    }
}
Run Code Online (Sandbox Code Playgroud)

存储库

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

    public function checkCapability($managers, $type)
    {
        ...
        return $capableManagers
    }
}
Run Code Online (Sandbox Code Playgroud)

服务

class ManagementService 
{
   ... I am not sure what should be here.
}
Run Code Online (Sandbox Code Playgroud)

小智 6

  1. EntityManager用于管理学说相关的对象,因此:
    • 您可以保留一个实体对象(它现在由学说管理,并准备保存)
    • 您可以删除实体对象(以便稍后将其删除)
    • 你可以刷新,它会触发挂起的操作
    • 您可以获取存储库(以获取您需要的对象)或使用通用 api 通过主键等获取对象。

它是一个管理对象状态及其与数据库关系的类。

存储库是一种标准化实体访问的模式。

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

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

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

  4. 在存储库中。诸如 findByRole(role=manager)、findIsActive、findOneBySecurityNumber 之类的方法依赖于存储库。