在 FOSUserBundle 中清除组和角色的使用
Posted
技术标签:
【中文标题】在 FOSUserBundle 中清除组和角色的使用【英文标题】:Clean usage of groups and roles in FOSUserBundle 【发布时间】:2015-10-20 10:37:22 【问题描述】:我目前正在做一个 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。虽然我不知道这是否有点开销,因为我的用户实际上共享相同的信息。
如果你们能指出我正确的方向,将不胜感激。也许有一个完整的其他方法可以正确地实现这一点。
【问题讨论】:
【参考方案1】:我的建议是直接使用角色,并完全停止使用 FOSUserBundle 组。大多数时候,它们是无用的。 组是从 symfony1 sfGuardPlugin 继承的概念,当时 Symfony 2 中还没有角色层次结构(在稳定版本之前)。 在大多数情况下,角色层次结构足以满足需求,使组更加复杂而无益。对于其他少数情况,我发现使用与项目实际业务逻辑相关的投票者比使用 FOSUserBundle 组更易于维护(我想我已经 4 年没有在任何项目中使用过它们了)。
免责声明:我是 FOSUserBundle 的主要维护者。
【讨论】:
嗯,这就是我最终实际所做的。使用 FOSUserBundle 组似乎无关紧要,因为我们使用 Symfony 角色定义了相同的层次结构。我确实发现了选民,这对我在业务方面轻松设置一些支票有很大帮助。谢谢!以上是关于在 FOSUserBundle 中清除组和角色的使用的主要内容,如果未能解决你的问题,请参考以下文章
在使用 FOSUserBundle 进行用户注册期间添加默认角色