Есть ли способ удалить все роли у пользователя с определенной ролью в Symfony? - PullRequest
1 голос
/ 05 июля 2019

Я использую FosUserBundle, который предоставляет функцию, где вы можете удалять роли.

$user->removeRole("ROLE_SUBSCRIBER_BASIC")

Это хорошо и все, но моя главная проблема в том, что я хотел бы удалить роль с помощью определенной роли. Моя иерархия в security.yml выглядит так:

    ROLE_SUBSCRIBER: ROLE_USER
    ROLE_SUBSCRIBER_MONTHLY: [ROLE_SUBSCRIBER]
    ROLE_SUBSCRIBER_YEARLY: [ROLE_SUBSCRIBER]
    ROLE_SUBSCRIBER_BASIC:  [ROLE_SUBSCRIBER]
    ROLE_PRIVILEGE_PLUS: [ROLE_SUBSCRIBER]
    ROLE_SUBSCRIBER_PLUS:  [ROLE_PRIVILEGE_PLUS]
    ROLE_SUBSCRIBER_EXTRA:  [ROLE_PRIVILEGE_PLUS]

Как видите, подписчики PLUS, EXTRA и BASIC все являются подписчиками, поэтому я дал им роль ROLE_SUBSCRIBER. В моей функции отказа от подписки я хотел бы удалить текущую роль подписчика, без необходимости использовать циклы if, например:

 public function unsubscribe(User $user)
    {
    if($user->hasRole("ROLE_SUBSCRIBER_BASIC")){
        $user->removeRole("ROLE_SUBSCRIBER_BASIC");
    }
    if($user->hasRole("ROLE_SUBSCRIBER_PLUS")){
        $user->removeRole("ROLE_SUBSCRIBER_PLUS");
    }
    if($user->hasRole("ROLE_SUBSCRIBER_EXTRA")){
        $user->removeRole("ROLE_SUBSCRIBER_EXTRA");
    }

... } * +1010 *

Этот цикл if / else выполняет свою работу, но думает о будущем. Что, если мой начальник хочет, чтобы было больше ролей подписчиков, тогда мне придется редактировать эту функцию каждый раз и добавлять еще один IF. Есть ли более эффективный способ сделать это? Как, например, удалив роль по роли.

$user->removeRole("ROLE_SUBSCRIBER")

Таким образом он автоматически удалит ROLE_SUBSCRIBER_EXTRA, ROLE_SUBSCRIBER_BASIC, ... MONTHLY, ... YEARLY или ... PLUS, без необходимости проверять, какая подписка у пользователя в настоящее время!?

1 Ответ

0 голосов
/ 05 июля 2019

Вы можете сделать что-то вроде этого:

const KEEP_ROLES = ['ROLE_ADMIN'];

$rolesToRemove = array_diff($user->getRoles(), KEEP_ROLES);

foreach ($rolesToRemove as $role) {
   $user->removeRole($role);
}
...