2015-07-28 4 views
2

Я использую Symfony2 с FOSUserBundle. Мне нужно получить максимальную роль для пользователя.Получить максимальную роль пользователя в Symfony2

role_hierarchy: 
     ROLE_CONTRIBUTOR: ROLE_USER 
     ROLE_MODERATOR: ROLE_CONTRIBUTOR 
     ROLE_ADMIN:  ROLE_MODERATOR 
     ROLE_SUPER_ADMIN: ROLE_ADMIN 

Если пользователь имеет роли ROLE_SUPER_ADMIN и ROLE_CONTRIBUTOR, мне нужен метод, как $user->getHighestRole(), что бы вернуть ROLE_SUPER_ADMIN. Мне нужно, чтобы это выполнялось внутри объекта User, потому что я создаю Rest API, и я хочу открыть метод getHighestRole() в качестве поля. Я не хочу иметь избыточную информацию о ролях в security.yml и в AppBundle\Entity\User.php. Могу ли я получить доступ к security.role_hierarchy в организации?

Я даже не уверен, что существует самая высокая роль, поскольку роль может содержать любую другую. У вас есть лидерство, за которым я мог бы последовать?

ответ

2

Вы тот, кто решает, который является «высшим» роль, так что вы можете просто сделать что-то подобное в вашем пользователя объекта:

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? 
} 
+0

Да, это то, что я думал, мне нужно повторить иерархию роли в сущности. – Hakim

+0

Да, вам нужно, потому что, если вы хотите сделать что-то более динамичное, вам нужно вставить контейнер внутри вашей сущности, и это немного грязно. –

1

вы можете получить role_hierarchy из контейнера, как:

но классы объектов должны оставаться POPO подмигнул не хорошую идею, чтобы контейнер осведомлен

$container->getParameter('security.role_hierarchy.roles') 

альтернативы вы можете прочитать файл YML с

use Symfony\Component\Yaml\Parser; 

$yaml = new Parser(); 

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

Да, инъекция контейнера - плохая идея/практика. И я не могу использовать менеджера, как я уже сказал, мне нужно вернуть объект – Hakim

+0

проверить мое обновление, возможно, вы могли бы вручную разобрать значение параметра без использования контейнера –

+0

Это было бы решением, да, но я думаю, На данный момент вы будете иметь избыточную информацию. Мы будем использовать его, если это вызовет проблемы – Hakim

Смежные вопросы