用于处理基于权限的函数的抽象类

时间:2012-03-13 15:46:47

标签: php permissions polymorphism abstract

我构建了一个抽象的User类,由Admin,Manager和Employee扩展。用户包含所有用户将需要的所有内容,并使用基于实例的不同逻辑抽象每个用户处理的所有内容。当我具有Admin或Manager类将以完全相同的方式处理的功能时,我的困惑就出现了,但是Employee将根本无法访问。

例如,管理除自身以外的用户应仅限于管理员和经理,而员工应该永远不能这样做。我想避免在Admin和Manager类中复制/粘贴完全相同的逻辑,所以我应该创建一个私有函数并将其移动到User类,只需要让Admin / Manager类从那里调用它?

abstract class User 
{
    public $username;
    public $userId;
    public $company;
    public $error;

    private function updateUser($user)
    {
        // Logic for saving the user info
    }
....
}

class Admin extends User
{
    public function updateUser($user)
    {
        parent::updateUser($user)
    }
....
}

class Manager extends User
{
    public function updateUser($user)
    {
        parent::updateUser($user)
    }
....
}

class Employee extends User
{
    public function updateUser($user)
    {
        $this->error = "Invalid Permissions";
    }
....
}

这应该以不同方式处理吗?感谢。

2 个答案:

答案 0 :(得分:1)

您可以将逻辑移动到用户基类中,并检查以确保指定的用户是管理员或管理员,但您可以在以后添加不同的“类”用户,这可能需要相同的功能,在这种情况下,您编写的代码将需要更新。

我的建议是一个新的抽象类,位于Manager / Admin用户和User抽象类之间,可能类似于UserEditorUserEditor扩展了用户并为管理员/管理员提供了更新其他用户的功​​能,管理员/管理员从UserEditor扩展而不是用户类。

答案 1 :(得分:0)

如果你这样做,我认为你应该有一个ACL类,并在函数中执行检查,这样你就不需要覆盖任何东西

abstract class User 
{
    public $username;
    public $userId;
    public $company;
    public $error;

    private final function updateUser($user)
    {
        if(ACL::checkIfUserHasPermissionToUpdateUser($this->userId){
            //Perform the update, this code will be executed only if the user
            //is a Manager or an Admin, but the logic is delegated to the ACL class
        }
    }

}