2012-03-27 26 views
1

我想知道如何分別處理用戶和會員在所有註冊用戶都視爲用戶,誰擁有一批用戶應用的應用,被認爲是成員 。其他用戶是嘉賓Zend框架 - 處理與用戶和會員

基本上,一個簡單的用戶可以找到一個團隊,接受團隊請求等的成員都可以看到他的團隊的個人資料,看到其他成員,並做了很多相對於成員和他的團隊更多的事情。

目前,用戶,成員和團隊在三個不同的類中處理,它們都代表它們的數據庫表結構。

所以,我在我的數據庫3個表如下:

MySQL Workbench

我有例如這個類來表示用戶:

class Lib_Model_Users_User implements Zend_Auth_Adapter_Interface, Zend_Acl_Role_Interface 
{ 
    protected $_gateway; 
    protected $_roleId; 

    protected $_member = null; 
    protected $_team = null; 

    protected $_data = array(
     'user_id'  => null, 
     'email'   => null, 
     'password'  => null, 
     'first_name' => null, 
     'last_name'  => null, 
     'gender'  => null, 
     'address'  => null, 
     'city'   => null, 
     'country'  => null, 
     'postal_code' => null, 
     'phone_mobile' => null, 
     'phone_home' => null, 
     'date_of_birth' => null, 
     'occupation' => null, 
     'active'  => false, 
     'created_on' => null, 
     'last_login' => null, 
     'last_update' => null); 

    public function __construct($data, $gateway) 
    { 
     $this->setGateway($gateway); 
     $this->populate($data); 

     if (!isset($this->user_id)) { 
      if (!isset($this->email)) { 
       if (!isset($this->first_name, $this->last_name)) 
        throw new Lib_Exception('Initial data must contain an email or a user id or a pair firstname/lastname'); 
      } 
     } 
    } 

    public function setMember($data) 
    { 
     $gateway = new Lib_Model_Teams_Gateway(); 
     $this->_member = $gateway->createMember($data); 
    } 

    public function getMember($status = 'active') 
    { 
     if (null === $this->getTeam()) { 
      return null; 
     } 

     if (null === $this->_member) { 
      $this->_member = $this->getTeam()->getMember($this->user_id); 
     } 

     if (is_string($status)) { 
      $status = array($status); 
     } 

     foreach ($status as $state) { 
      if ($this->_member->status == $state) { 
       return $this->_member; 
      } 
     } 
     return null; 
    } 

    public function getTeam($active = true) 
    { 
     if ($this->_team === null) { 
      $this->_team = $this->getGateway()->fetchTeam($this->user_id, $active); 
     } 
     return $this->_team; 
    } 

    public function save() 
    { 
     $gateway = $this->getGateway(); 
     $dbTable = $gateway->getDbTable(); 
     $row = $dbTable->find($this->user_id)->current(); 
     if ($row) { 
      foreach ($this->_data as $key => $value) { 
       $row->$key = $value; 
      } 
      return $row->save(); 
     } 
     $this->user_id = $dbTable->insert($this->_data); 
     return $this->user_id; 
    } 

    public function getRoleId() 
    { 
     if (null === $this->_roleId) 
      $this->_roleId = $this->user_id; 
     return $this->_roleId; 
    } 

    .......... 
    // etc. 
    .......... 
} 

正如你所看到的,這個類是非常「堅持」我的數據庫領域,我不知道這是否是最好的方式來做到這一點。

我的會員模式基本一樣,只不過它代表的「team_users」表中,並沒有設置/ getMembers方法,但具有相對於成員的方法。

現在,你明白管理這樣的事情有多難,每次我想要一個成員,我需要檢查一個用戶是否有團隊,如果是的話,我使用getMember()等創建一個成員實例

從會員方面來說,很難得到關於會員的信息,例如他的first_name,我總是需要檢查user_id,創建一個用戶實例並獲得他的first_name

我該如何處理這種事情?我在想也許我的會員模式應該擴展用戶模式,因爲成員也是用戶?這是個好主意嗎?你會怎麼做?

謝謝。

+0

無關 - 您創建的建模軟件的截圖與? – 2012-03-27 17:10:37

+0

MySQL Workbench;) – 2012-03-27 17:23:04

+1

好啊,從來沒有嘗試過。現在下載。謝謝! – 2012-03-27 17:31:08

回答

1

無論數據庫的結構如何 - 以事物的方式進行建模 - 在大多數情況下,這種方法最適合工作。

  • 作爲成員是某種類型的用戶,Member類應擴展User類。
  • 只有成員類應該有一個方法getTeam(),因爲只有成員擁有一個團隊而普通用戶則不具有。

我不認爲真的有一個美麗的解決方案來處理您的確切情況。但是這樣的事情呢?

$user = new User($data, $gateway); 
if ($user->hasTeam()) { 
    $user = Member::fromUser($user); // returns a new instance of 'Member' 
} 
+0

謝謝,我還有另一個問題。如何以及在哪裏確定應該實例化哪個類?我應該使用根據他的身份(是否在teamusers表中)創建用戶或成員的工廠? – 2012-03-28 07:29:48

+0

這就是我的例子:我會一直創建一個User實例,然後檢查該用戶是否有Team,如果是,則在Member實例中轉換該User實例。 – Niko 2012-03-28 07:40:34

+0

謝謝你的解釋! – 2012-03-28 08:13:28