Я использую 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, без необходимости проверять, какая подписка у пользователя в настоящее время!?