我正在使用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 else循环,如下所示:
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");
}
... }
这个if / else循环可以完成工作,但要考虑未来。如果我的老板希望有更多的订户角色,那我将不得不每次都编辑此功能并添加另一个IF。有没有更有效的方法可以做到这一点?就像通过按角色删除角色一样。
$user->removeRole("ROLE_SUBSCRIBER")
这样,它将自动删除ROLE_SUBSCRIBER_EXTRA,ROLE_SUBSCRIBER_BASIC,... MONTHLY,... YEARLY或... PLUS,而无需我检查用户当前具有哪种订阅!!
答案 0 :(得分:0)
您可以执行以下操作:
const KEEP_ROLES = ['ROLE_ADMIN'];
$rolesToRemove = array_diff($user->getRoles(), KEEP_ROLES);
foreach ($rolesToRemove as $role) {
$user->removeRole($role);
}