如何处理用户状态
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;
}
但我对 管理用户状态的最佳(或更好)方法是什么感到困惑:
只使用一种方法,例如 $user->changeStatusTo($status),它类似于 $user->setStatus($status);
创建类似 $user->enable()、$user->disable()、$user->ban() 的方法 eloquent 但可能会导致问题如果我以后有更多状态;
很高兴看到任何答案和建议,谢谢!
我会创建两个变体并让它们相互调用。所以调用 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());
?>
目前,我有具有预定义状态的用户实体作为常量。默认情况下,用户有 STATUS_NOT_CONFIRMED。
interface UserInterface
{
const STATUS_ENABLED = 1;
const STATUS_DISABLED = 2;
const STATUS_BANNED = 3;
const STATUS_NOT_CONFIRMED = 4;
}
但我对 管理用户状态的最佳(或更好)方法是什么感到困惑:
只使用一种方法,例如 $user->changeStatusTo($status),它类似于 $user->setStatus($status);
创建类似 $user->enable()、$user->disable()、$user->ban() 的方法 eloquent 但可能会导致问题如果我以后有更多状态;
很高兴看到任何答案和建议,谢谢!
我会创建两个变体并让它们相互调用。所以调用 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());
?>