Symfony2:获取用户实体中组的角色,但避免在实体内部查询
Symfony2: Get roles of groups in user entity but avoid query inside entity
我的 User
实体实现了 UserInterface
,因此提供了 getRoles()
方法。在我的系统中,一个 User
可以属于多个 Group
。一个组可以有多个角色。因此,可以通过收集所有组并合并这些组的角色列表来确定用户的角色。 FOSUserBundle.
也可能发生同样的事情
最简单的算法是:
public function getRoles()
{
$roles = $this->roles;
foreach ($this->getGroups() as $group) {
$roles = array_merge($roles, $group->getRoles());
}
return array_unique($roles);
}
我认为这个解决方案是有问题的,因为它的扩展性很差。对于每个组,必须执行一个新的查询,因此查询的数量取决于组的数量。
通常我会通过定义一个查询来解决这个问题,该查询收集所有用户组并加入组的角色。这将需要从 User
实体调用 UserRepository
(或直接构建 Doctrine 查询),我认为这是一种不好的做法。
那么如何在保持单个连接查询的性能优势的同时避免这种不良做法呢?
(这次好不容易找到一个合适的题名,不知道有没有其他类似的情况,但我不这么认为,因为通常我会在题目中提供这样的方法存储库本身。在这种情况下,UserInterface
要求它在实体中)
最简单的方法是创建自定义 UserProvider。
有关文档,请参阅 http://symfony.com/doc/current/security/custom_provider.html#create-a-user-provider。
在此用户提供程序中,您必须通过用户名向 select 用户查询并添加到组实体的加入,因此您只有一个查询
我的 User
实体实现了 UserInterface
,因此提供了 getRoles()
方法。在我的系统中,一个 User
可以属于多个 Group
。一个组可以有多个角色。因此,可以通过收集所有组并合并这些组的角色列表来确定用户的角色。 FOSUserBundle.
最简单的算法是:
public function getRoles()
{
$roles = $this->roles;
foreach ($this->getGroups() as $group) {
$roles = array_merge($roles, $group->getRoles());
}
return array_unique($roles);
}
我认为这个解决方案是有问题的,因为它的扩展性很差。对于每个组,必须执行一个新的查询,因此查询的数量取决于组的数量。
通常我会通过定义一个查询来解决这个问题,该查询收集所有用户组并加入组的角色。这将需要从 User
实体调用 UserRepository
(或直接构建 Doctrine 查询),我认为这是一种不好的做法。
那么如何在保持单个连接查询的性能优势的同时避免这种不良做法呢?
(这次好不容易找到一个合适的题名,不知道有没有其他类似的情况,但我不这么认为,因为通常我会在题目中提供这样的方法存储库本身。在这种情况下,UserInterface
要求它在实体中)
最简单的方法是创建自定义 UserProvider。
有关文档,请参阅 http://symfony.com/doc/current/security/custom_provider.html#create-a-user-provider。
在此用户提供程序中,您必须通过用户名向 select 用户查询并添加到组实体的加入,因此您只有一个查询