我了解好处或存储库模式,但我无法在Symfony3 Doctrine中了解Doctrine\ORM\EntityManager
和\Doctrine\ORM\EntityRepository
是否应将存储库注入控制器或实体管理器?
修改 正确的问题应该是:从控制器访问存储库的正确方法是什么?
实体经理是否应该包含任何查询? 的修改 正确的问题应该是:服务是否应包含查询?其中@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 \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.
}
答案 0 :(得分:2)
这是一个管理对象状态及其与数据库关系的类。
存储库是一种标准化对访问者的访问的模式。
如果您的应用程序很复杂,您应该向控制器注入单独的服务。因此,有一个UserSaver服务(作为示例)使用entityManager使用UserRepository创建/更新用户和UserFinder(或名称很好的东西),UserRepository负责按定义的标准获取用户。
您可以使用实体管理器创建查询,但em本身不能包含查询。
在我看来,定义服务内部的方法,以及UserRepository中的相应方法。此时,您想要的所有内容都应该由数据库提取,但以后可能会更改。
在存储库中。方法如:findByRole(role = manager),findIsActive,findOneBySecurityNumber依赖于存储库。