symfony - FOSUserBundle 中组和角色的干净使用

标签 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 。虽然我不知道这是否有点开销,因为我的用户实际上共享相同的信息。

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

最佳答案

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

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

关于symfony - FOSUserBundle 中组和角色的干净使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31700595/

相关文章:

sonata-user-bundle - Symfony 4 Sonata 用户包安装

symfony - 值必须是字符串类型,返回null

javascript - 使用 Zurb Foundation 和 Symfony2

php - Symfony2 记住我不适用于 fos 用户包

php - 在 Symfony2 中从 AuthenticationHandler 设置 flashMessage

symfony - FOSUserBundle "Register"路由重定向到 "Login"路由

symfony - fatal error 异常: Error: Class 'ResourceBundle' not found

php - fatal error 异常: Error: Class 'PDO' not found on symfony2

Symfony 3.3 自动配置服务和使用

php - Symfony2 - 奏鸣曲和 KnpMenu - setCurrentUri