我目前正在开发 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
...
}
这显然是非常糟糕的。
我的问题是我确定如何以良好的方式重构它。
我看到了三种可能的方法:
直接使用定义的角色进行工作:ROLE_ADMIN、ROLE_CONSULTANT、ROLE_BUSINESS;
仍然使用组,但使用一些带有组名称的常量,以避免到处重复;
在 FOSUserBundle 之上使用多用户系统。我赶紧回顾了RollerworksMultiUserBundle和 PUGXMultiUserBundle 。虽然我不知道这是否有点开销,因为我的用户实际上共享相同的信息。
如果你们能给我指出正确的方向,我将不胜感激。也许还有一种完整的其他方法可以正确实现这一目标。
最佳答案
我的建议是直接使用角色,并完全停止使用 FOSUserBundle 组。大多数时候,它们是无用的。 组是从 symfony1 sfGuardPlugin 继承的概念,当时角色层次结构在 Symfony 2 中尚不可用(远远早于稳定版本)。 在大多数情况下,角色层次结构足以满足需求,但使组变得更加复杂却没有任何好处。对于其他少数情况,我发现使用与项目实际业务逻辑相关的投票者比使用 FOSUserBundle 组更易于维护(我想我已经 4 年没有在任何项目中使用过它们了)。
免责声明:我是 FOSUserBundle 的主要维护者。
关于symfony - FOSUserBundle 中组和角色的干净使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31700595/