如何根据用户的角色允许访问PHP方法


How to allow access to PHP methods according to user's role?

我有一个基本的User模型,可以满足一般用户的所有需求。现在我需要为用户创建几个不同的角色,每个角色都有大约10-20种不同的方法,这些方法是其他角色无法使用的。

假设我必须加载泛型User类来确定用户的角色…

既然将这么多不同的基于角色的方法打包到通用的User模型中是低效和繁重的(当它们不能被所有角色使用时),那么只有当用户需要时才允许他们访问基于角色的方法的最佳方法是什么?

以下是我正在考虑的一些想法:

  1. 为每个角色提供一个单独的服务类,并根据用户的角色将它们提供给User类

  2. 简单地拖拽用户类中的所有方法,只有当用户具有正确的角色时才允许访问每个方法。

  3. 完全重构并使基于角色的类继承User类

这些都是好主意吗,还是有更好的主意?

为什么不直接将基于角色的类组合到User对象中呢?

$user = new User(/* pass role as an arg */);
// Internally:
// if ($user->getRole() instanceof AdminRole) or similar...
if ($user->isAdmin()) {
    // AdminRole::doSomethingAdminish()
    $user->getRole()->doSomethingAdminish();
}

看一下工厂模式。从本质上讲,您向它传递实例化对象所需的数据,然后它返回处于就绪状态的正确对象。

也许像

class UserFactory
{
   public static function getUser($userId)
   {
      $user = new User($userId);
      switch ($user->getType()) {
         case 'admin' :
            return new AdminUser($user);
         case 'guest' :
            return new GuestUser($user);
         default :
            //handle 
      }
   }
}