Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/symfony/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Symfony2中获得最高用户角色_Symfony_Fosuserbundle_Roles - Fatal编程技术网

在Symfony2中获得最高用户角色

在Symfony2中获得最高用户角色,symfony,fosuserbundle,roles,Symfony,Fosuserbundle,Roles,我用的是Symfony2和FOSUserBundle。我需要获得用户的最高角色 role_hierarchy: ROLE_CONTRIBUTOR: ROLE_USER ROLE_MODERATOR: ROLE_CONTRIBUTOR ROLE_ADMIN: ROLE_MODERATOR ROLE_SUPER_ADMIN: ROLE_ADMIN 如果用户具有角色ROLE\u SUPER\u ADMIN和ROLE\u

我用的是Symfony2和FOSUserBundle。我需要获得用户的最高角色

role_hierarchy:
        ROLE_CONTRIBUTOR: ROLE_USER
        ROLE_MODERATOR:   ROLE_CONTRIBUTOR
        ROLE_ADMIN:       ROLE_MODERATOR
        ROLE_SUPER_ADMIN: ROLE_ADMIN
如果用户具有角色
ROLE\u SUPER\u ADMIN
ROLE\u CONTRIBUTOR
,我需要一个类似
$user->getHighestRole()
的方法,该方法将返回
ROLE\u SUPER\u ADMIN
。我需要在用户实体内部完成,因为我正在构建一个RESTAPI,并且我想将
getHighestRole()
方法作为字段公开。 我不想在
security.yml
AppBundle\Entity\User.php
中有关于角色的冗余信息。我可以访问实体中的
安全.角色层次结构

我甚至不确定是否有最高级别的角色,因为一个角色可以包含任何其他角色。
你有什么线索我可以遵循吗?

你是决定哪一个是“最高”角色的人,所以你可以在你的用户实体中简单地做这样的事情:

public function getHighestRole()
{
    $rolesSortedByImportance = ['ROLE_SUPER_ADMIN', 'ROLE_ADMIN', 'ROLE_MODERATOR', 'ROLE_CONTRIBUTOR', 'ROLE_USER'];
    foreach ($rolesSortedByImportance as $role)
    {
        if (in_array($role, $this->roles))
        {
            return $role;
        }
    }

    return false; // Unknown role?
}

您可以从以下容器中获取角色\u层次结构:

但是,由于实体类应该保持POPO,所以最好不要使用容器感知

  $container->getParameter('security.role_hierarchy.roles')
或者,您可以使用

use Symfony\Component\Yaml\Parser;

$yaml = new Parser();

$arrayOfOptions = $yaml->parse(file_get_contents('/path/to/security.yml'));

是的,这就是我所想的,我需要重复实体中的角色层次结构。是的,你需要,因为如果你想做一些更具动态性的事情,你需要在你的实体中注入容器,这有点难看。是的,注入容器是一个坏主意/做法。我不能使用管理器,正如我所说的,我需要返回entitycheck我的更新,也许你可以不使用Container手动解析选项值这将是一个解决方案,是的,但我认为我现在将坚持使用冗余信息。如果它引起问题,我们将在使用它的过程中