Как обрабатывать пользовательские статусы

На данный момент у меня есть пользовательская сущность с предопределенными статусами в качестве констант. У пользователя есть 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 (), что более красноречиво, но может привести к проблеме, если в будущем у меня будет больше статусов;

Буду рад любым ответам и советам, спасибо!

0

Решение

Я бы создал оба варианта и позволил бы им звонить друг другу. Так зовет 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);
}
// ...

}
1

Другие решения

Я могу предложить использовать магический метод __get () с userInterface и динамически проверять константу ниже.

<?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

По вопросам рекламы [email protected]