如何处理用户状态

How tohandle user statuses

目前,我有具有预定义状态的用户实体作为常量。默认情况下,用户有 STATUS_NOT_CONFIRMED。

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

但我对 管理用户状态的最佳(或更好)方法是什么感到困惑

很高兴看到任何答案和建议,谢谢!

我会创建两个变体并让它们相互调用。所以调用 ban 会调用 setStatus。如果您稍后添加新状态,您可以扩展 setStatus,如果确实需要,添加一个新方法。

出于方便的原因,我还会扩展 UserInterface 接口以保存 max 值。这样,您可以在不触及 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);
    }
    // ...

}

我可以建议对用户界面使用魔术方法 __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());
?>