2016-11-19 118 views
0

我正在努力爲存儲在數據庫中的部分創建一個訪問對象。這是一個過程的skellington,它包含靜態數據,直到我能夠得到原理的工作。我應該什麼時候回來?

class User { 
    const IS_ADMIN = 1; 
    const IS_MODERATOR = 2; 
    const IS_MEMBER = 4; 
} 

該類將最終自動從數據庫加載數據,但暫時該類具有默認值。

class Scope { 
    private $priv = []; 

    public function __construct() { 
     $this->priv = [1]; 
    } 

    public function getPrivilidges() { 
     return $this->priv; 
    } 
} 

這是它混亂的地方,我可以告訴第二個和第三個條件不能滿足,如果第一個失敗,我怎麼能阻止呢?

class Priverlidges { 
    public function canView($type, Scope $scope) { 
     if($type & User::IS_ADMIN) { 
      foreach($scope->getPrivilidges() as $p) { 
       if($p == User::IS_ADMIN) continue; 
       return false; 
      } 
      return true; 
     } 

     if($type & User::IS_MODERATOR) { 
      foreach($scope->getPrivilidges() as $p) { 
       if($p == User::IS_MODERATOR) continue; 
       return false; 
      } 
      return true; 
     } 

     if($type & User::IS_MEMBER) { 
      foreach($scope->getPrivilidges() as $p) { 
       if($p == User::IS_MEMBER) continue; 
       return false; 
      } 
      return true; 
     } 
    } 
} 

實施例使用時的priverlidge的默認值是1的正常工作:

echo (int)(new Priverlidges)->canView(User::IS_ADMIN, new Scope()); 

實施例使用時的priverlidge的默認值是2的正常工作:

echo (int)(new Priverlidges)->canView(User::IS_MODERATOR | User::IS_ADMIN, new Scope()); // it returns false at the first condition 

任何人都可以幫助我何時返回真或假?提前致謝。
P.S - 用戶既可以是MODS和管理員

編輯:我曾嘗試使用in_array()仍不能確定何時返回值truefalse,因爲它得到,如果第二個方法運行的覆蓋。

+0

我不太明白理想的邏輯。如果它不存在於$ scope-> getPrivilidges()'中,你想跳過一個'User'常量的檢查嗎? –

+0

它是一個RBAC控制器,每個角色都有訪問權限表的權限。由於只有,並且只會有3個用戶組。我只是硬編碼組。代碼(最終會)查詢'Scope'對象中的權限,然後開發人員可以輕鬆檢查用戶是否有權限控制器/視圖。例如,MOD控制面板。但是,當然,這仍然需要改變,因爲有讀取,寫入和編輯範圍。 @RuslanOsmanov – KDOT

回答

0

我想通了。首先,檢查用戶是否已使用佔位符($this->_state)進行身份驗證。然後檢查用戶的類型並檢查它是否在範圍內。

class Priverlidges { 

    private $_state = false; 

    public function canView($type, Scope $scope) { 
     if(!$this->_state && $type & User::IS_ADMIN && in_array(User::IS_ADMIN, $scope->getPrivilidges())) { 
      $this->_state = true; 
     } 

     if(!$this->_state && $type & User::IS_MODERATOR && in_array(User::IS_MODERATOR, $scope->getPrivilidges())) { 
      $this->_state = true; 
     } 

     if(!$this->_state && $type & User::IS_MEMBER && in_array($scope->getPrivilidges(), User::IS_MEMBER)) { 
      $this->_state = true; 
     } 

     return $this->_state; 
    } 

} 
相關問題