我理解收益或存储库模式,但我就是不理解Symfony3条令中有DoctrineORMEntityManager
和DoctrineORMEntityRepository
- 两者之间有什么区别
-
存储库应该注入控制器还是实体管理器?
编辑正确的问题应该是:从控制器访问存储库的正确方式是什么?
- 是否应该将存储库作为服务注入控制器
- 是否应该将存储库作为服务注入另一个服务
-
实体管理器是否应该包含任何查询
编辑正确的问题应该是:服务是否应该包含查询?@MateuszSip已经解释过,这可以通过注入实体管理器来实现 -
是否应该放入像
getAvailableManagers
这样的自定义函数存储库还是服务?(其中manager
是存储库确定available manager
)的一些逻辑 - 像
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 DoctrineORMEntityRepository
{
public function findAvailableManagers()
{
...
return $managers
}
public function checkCapability($managers, $type)
{
...
return $capableManagers
}
}
服务
class ManagementService
{
... I am not sure what should be here.
}
- EntityManager用于管理条令相关对象,因此:
- 您可以持久化实体对象(它现在由条令管理,并准备保存)
- 您可以删除实体对象(以便稍后删除)
- 您可以刷新,它将触发挂起的操作
- 您可以获得一个存储库(以获得您需要的对象),或者使用通用api通过主键获得对象等等
它是一个管理对象状态及其与数据库关系的类。
Repository是一种标准化对实体的访问的模式。
-
如果你的应用程序很复杂,你应该向你的控制器注入一个单独的服务。因此,有一个UserSaver服务(作为一个例子),它使用entityManager来创建/更新用户,并使用UserRepository来创建UserFinder(或命名良好的东西),UserRepository负责根据定义的标准获取用户。
-
您可以使用实体管理器创建查询,但em本身不能包含查询。
-
在我看来,在服务中定义一个方法,并在UserRepository中定义相应的方法。此时,您想要的所有内容都应该由数据库获取,但以后可能会更改。
-
在存储库中。findByRole(role=manager)、findIsActive、findOneBySecurityNumber等方法依赖于存储库。