2012-03-13 45 views
1

我已經構建了一個由Admin,Manager和Employee擴展的抽象User類。用戶包含所有用戶需要的所有內容,並根據實例抽象出每個用戶使用不同邏輯處理的所有內容。當我擁有管理員或經理類將以完全相同的方式處理的功能時,我的困惑就出現了,但員工根本無法訪問。處理基於權限的函數的抽象類

例如,管理除自身以外的用戶應該僅限於管理員和管理員,而員工永遠不能這樣做。我想避免在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"; 
    } 
.... 
} 

這應該以不同的方式處理嗎?謝謝。

回答

1

您可以通過檢查將邏輯移動到用戶基類中,以確保指定的用戶是管理員或管理員,但可以在以後添加不同的「用戶類」,這可能需要相同的功能在這種情況下,你寫的代碼將需要更新。

我的建議是一個新的抽象類,位於Manager/Admin用戶和User抽象類之間,可能類似於UserEditorUserEditor擴展了用戶,並提供管理員/管理員更新其他用戶的功​​能,管理員/管理員從UserEditor擴展而不是您的User類。

0

如果你不喜歡這樣,我認爲你應該有一個ACL類的Performa在功能的檢查,這樣你就不需要重寫任何

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 
     } 
    } 

} 
+0

我有ACL內置到網站我正在使用頁面權限,所以這不會是一個問題。儘管如此,我當然會更喜歡這個實例來決定是否可以執行該操作。你還會推薦使用觀察者解決方案進行ACL檢查嗎? – 2012-03-13 16:22:08