我有一个基本的用户模型,可以满足普通用户的所有需求。我现在需要为用户创建几个不同的角色,每个角色都有大约10-20种不同的方法,这些方法不能被其他角色使用。
假设我必须加载通用User类来确定用户的角色......
由于将这么多不同的基于角色的方法打包到通用用户模型中(当所有角色都无法使用它们时)效率低下而且很重要,让用户访问基于角色的方法的最佳方式是什么?只有当他们需要它们时?
以下是我要折腾的一些想法:
每个角色都有一个单独的服务类,并根据用户的角色将它们提供给User类
只需简化用户类中的所有方法,并且只有在用户具有正确角色时才允许访问每个方法。
完全重构并使基于角色的类继承自User类。
这些好主意是什么,还是有更好的主意?
答案 0 :(得分:3)
为什么不将基于角色的类组合到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();
}
答案 1 :(得分:2)
看看工厂模式。实质上,您将实例化对象所需的数据传递给它,并以正常使用状态返回正确的对象。
也许像
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
}
}
}