2017-04-18 78 views
0

目前,我有用戶實體具有預定義的狀態作爲常量。用戶默認情況下有STATUS_NOT_CONFIRMED。如何處理用戶狀態

interface UserInterface 
{ 
    const STATUS_ENABLED = 1; 
    const STATUS_DISABLED = 2; 
    const STATUS_BANNED = 3; 
    const STATUS_NOT_CONFIRMED = 4; 
} 

但我堅持用一個問題是什麼來管理用戶的最佳(或更好)的方法狀態:$只用一個方法

  • 像$用戶> changeStatusTo(狀態),類似於$ user-> setStatus($ status);創建像$ user-> enable(),$ user-> disable(),$ user-> ban()這樣的方法,這更加雄辯,但如果將來我有更多的狀態會導致問題;

我很高興看到任何答案和建議,謝謝!

+0

至於我,第一個選項是比第2的好。使用一種方法設置狀態,以便它可以處理應用程序中動態的狀態數量。第一個選項的維護會更容易。 – prava

+0

我更喜歡第二種方式,你可以把changeStatus作爲私人功能放在用戶中,但是用戶應該有沒有參數的特定動作 – 4EACH

+0

@ 4EACH謝謝你的回覆。你能否解釋一下,爲什麼你更喜歡第一個選項的第二個選項? – Shandur

回答

1

我會創建兩個變體,讓他們互相呼叫。所以調用ban將會調用setStatus。如果稍後添加新狀態,則可以擴展setStatus,如果確實需要,請添加新方法。

爲了方便起見,我還擴展了UserInterface接口來保存值。這樣,您可以在不觸及setStatus方法的情況下更改界面。

interface UserInterface 
{ 
    const STATUS_ENABLED = 1; 
    const STATUS_DISABLED = 2; 
    const STATUS_BANNED = 3; 
    const STATUS_NOT_CONFIRMED = 4; 

    const STATUS_MAX = self::STATUS_NOT_CONFIRMED; 
} 

class User implements UserInterface { 

    // ... 
    function setStatus($status) { 
     if ($status < 0 || $status > UserInterface::STATUS_MAX) { 
      throw InvalidArgumentException('status'); 
     } 
     $this->status = $status; 
    } 

    function ban() { 
     $this->setStatus(UserInterface::STATUS_BAN); 
    } 
    // ... 

} 
+0

感謝您的回答!我喜歡。 我只是想:如果我創建UserService類來處理用戶實體的操作。它將具有像$ userService-> banUser($ userId)等方法,並且用戶將只有setStatus(..)方法,如上所述。你怎麼看待這件事? – Shandur

+0

創建一個UserService來實現這個imho是唯一有意義的,如果用戶模型目前不知道,如何存儲他自己的數據,你必須調用一些外部類來實現持久化。如果你需要一個持久化的外部類,並且setStatus實際上調用了UserService,那麼我認爲沒有問題。您不應該將單個模型的持久性邏輯分散到多個類中,否則您會遇到問題,如果發生某些變化 – Philipp

+0

我的模型不知道持久性,我使用doctrine作爲持久性材料。 我的意思是使用包含方法enable(),disable()和ban()的UserService。這些方法將調用用戶模型的setStatus(..)。在用戶服務中的示例:function banUser($ userId){$ user = $ this-> userRepo-> find($ userId); $ user-> setStatus(BANNED)}; – Shandur

0

我可以建議用魔術方法__get()與用戶接口,並檢查動態不斷在下面的方式

<?php 

interface UserInterface 
{ 
    const STATUS_ENABLE = 1; 
    const STATUS_DISABLE = 2; 
    const STATUS_BAN = 3; 
    const STATUS_NOT_CONFIRM = 4; 
    const STATUS_DEFAULT = self::STATUS_NOT_CONFIRM; 
} 

class User implements UserInterface{ 
    public $status = UserInterface::STATUS_DEFAULT; 
    private function setStatus($status) { 
     if ($status < 0 || $status > UserInterface::STATUS_DEFAULT) { 
      throw InvalidArgumentException('status'); 
     } 
     $this->status = $status; 
    } 
    public function getStatus() { 
     return $this->status; 
    } 

    function __call($fn_name,$args) 
    { 
     if(strpos($fn_name,'make')==0) 
     { 
      $statusChangeTo = "STATUS_".strtoupper(substr($fn_name,4)); 
      $constant= 'UserInterface::'.$statusChangeTo; 
      if(defined($constant)) 
      { 
       $this->setStatus(constant($constant)); 
      } 
      else 
      { 
       throw new Exception("Invalid method ".$fn_name); 
      } 
     } 
     else 
     { 
      throw new Exception("Invalid method ".$fn_name); 
     } 
    } 

} 
$user= new User(); 
var_dump($user->getStatus()); 
$user->makeBan(); 
var_dump($user->getStatus()); 
?> 
+0

感謝您的回覆,但我不喜歡使用魔術方法的方式 – Shandur

+0

@Shandur沒有使用魔術方法,沒有辦法實現動態狀態的動態功能 –