FOSUserBundle 中组和角色的干净使用

Clean usage of groups and roles in FOSUserBundle

我目前正在从事 Symfony2 项目。它基于 Sonata 并使用 SonataUserBundle/FOSUserBundle 来管理用户。最初的开发做得很糟糕,我正在重构其中的大部分内容。

应用程序定义了三级用户:

它们被定义为带有 FOSUserBundle 的组,并附加了一堆角色。

现在在代码的任何地方,以前的开发人员都使用(硬编码)组的数据库 ID 来制作这样的案例:

$userGroup = $em->getRepository('ApplicationSonataUserBundle:Group')->findOneByName($group_name);
$userGroupId = $userGroup->getId();

if ($userGroupId == 1) {
   // Administrator case
   ...
} else if ($userGroupId == 7) {
   // Consultant case
   ...
}

这显然很糟糕。

我的问题是我确定如何以良好的方式重构它。
我看到了三种可能的方式:

  1. 直接使用定义的角色:ROLE_ADMIN、ROLE_CONSULTANT、ROLE_BUSINESS;

  2. 仍然使用组,但组名有一些常量以避免在各处重复;

  3. 在 FOSUserBundle 之上使用多用户系统。我很快回顾了RollerworksMultiUserBundle and PUGXMultiUserBundle。虽然我不知道这是否有点开销,因为我的用户实际上共享相同的信息。

如果你们能指出我正确的方向,我将不胜感激。也许有一个完整的其他方法来正确地实现这一目标。

我的建议是直接使用角色,完全停止使用 FOSUserBundle 组。大多数时候,它们是无用的。 组是从 symfony1 sfGuardPlugin 继承的概念,当时角色层次结构在 Symfony 2 中尚不可用(在稳定版本之前)。 在大多数情况下,角色层次结构足以满足需求,使组变得更复杂没有任何好处。对于其他少数情况,我发现使用与项目的实际业务逻辑相关的选民比使用 FOSUserBundle 组更易于维护(我想我已经 4 年没有在任何项目中使用过它们了)。

免责声明:我是 FOSUserBundle 的主要维护者。