Абстрактный класс для обработки функций на основе разрешений - PullRequest
1 голос
/ 13 марта 2012

Я создал абстрактный класс User, который расширен администратором, менеджером и сотрудником. Пользователь содержит все, что потребуется всем пользователям, и абстрагирует все, что обрабатывает каждый пользователь, используя различную логику в зависимости от экземпляра. Моя путаница возникает, когда у меня есть функциональные возможности, которые класс Admin или Manager будет обрабатывать точно так же, но Сотрудник не сможет получить доступ вообще.

Например, управление пользователем, отличным от самого себя, должно быть ограничено только администраторами и менеджерами, в то время как сотрудник никогда не должен этого делать. Я хочу избежать копирования / вставки одной и той же логики как в классе 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 ]

1 голос
/ 13 марта 2012

Вы можете переместить логику в базовый класс User с проверкой, чтобы убедиться, что указанный пользователь является либо администратором, либо администратором, но вы можете добавить другие «классы» пользователей позднее, которым могут потребоваться те же функции,в этом случае код, который вы написали, должен быть обновлен.

Я бы предложил новый абстрактный класс, который находится между пользователями Manager / Admin и абстрактным классом User, возможно, что-то вроде UserEditor.UserEditor расширяет возможности пользователя и предоставляет администраторам / менеджерам функциональные возможности для обновления других пользователей, а администраторы / менеджеры расширяются из UserEditor вместо вашего класса пользователя.

0 голосов
/ 13 марта 2012

Если вы сделаете это так, я думаю, что вы должны иметь класс 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
        }
    }

}
...