在FOSUserBundle

时间:2015-07-29 12:37:00

标签: symfony fosuserbundle sonata-user-bundle

我目前正在开发一个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之上使用多用户系统。我很快就审核了RollerworksMultiUserBundlePUGXMultiUserBundle。虽然我不知道这是否有点开销,因为我的用户实际上共享相同的信息。

  4. 如果你们能指出我正确的方向,那将非常感激。也许有一种完全正确的方法来实现这一点。

1 个答案:

答案 0 :(得分:5)

我的建议是直接使用角色,并完全停止使用FOSUserBundle组。大多数时候,它们都没用。 在Symfony 2中尚未提供角色层次结构(稳定版本之前的方式)时,组是继承自symfony1 sfGuardPlugin的概念。 在大多数情况下,角色层次结构足以满足需求,使团队更加复杂,没有任何好处。对于其他一些案例,我发现使用与项目实际业务逻辑相关的选民比使用FOSUserBundle组更易于维护(我认为自4年以来我没有在任何项目中使用过它们。)

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