2

我理解的利益或仓库的模式,但我不能在Symfony3主义理解有Doctrine\ORM\EntityManager\Doctrine\ORM\EntityRepositorySymfony的学说实体管理器和库

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

回答

2
  1. 的EntityManager用于管理学说相关的对象,所以:
    • 你能坚持一个实体对象(它现在被教条管理,并准备保存)
    • 你可以删除一个实体对象(所以它会在稍后删除)
    • 你可以刷新,并“会触发挂起操作
    • 你可以得到一个存储库(让你需要的对象),或使用一个通用的API,通过主键 等获取对象

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

存储库是一种标准化访问限制的模式。

  1. 如果您的应用程序非常复杂,则应该向控制器注入单独的服务。因此,有一个UserSaver服务(作为示例),它使用entityManager创建/更新用户和UserFinder(或者其他名称良好的用户),UserRepository负责根据定义的标准提取用户。

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

  3. 在我看来,在服务中定义一个方法,并在UserRepository中定义一个相应的方法。在这一刻,所有你想要的东西都应该被数据库获取,但是它可能会在以后改变。

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

+0

感谢您的回答。为了您的观点4.服务访问存储库如何?是通过注射吗?还是通过' - > entityManager-> getRepository'? –

+0

您可以将存储库定义为服务并将其注入到服务中。 –

+0

如果我将我的存储库定义为服务,为什么需要将其注入另一个服务?我不应该只是将存储库作为服务注入控制器吗?另外如果我使用注入,那么' - > entityManager-> getRepository'有什么意义呢?感谢并抱歉,如果问题太多 –