8

我了解好处或存储库模式,但我只是无法理解 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
    }
}

存储库

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.
}
4

1 回答 1

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

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

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

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

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

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

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

于 2016-05-31T00:55:10.097 回答