Механизм обработки пользовательских состояний в PHP - PullRequest
5 голосов
/ 04 октября 2011

Я хочу реализовать обработку состояния пользователя / рабочего процесса в приложении PHP.

В настоящее время есть:

  • пользовательская система с примерно 10 различными состояниями, в которых может находиться любой пользователь (включен, отключен, предварительно зарегистрирован, отменен, удален и т. Д.)
  • определенные правила относительно того, из какого состояния пользователь может перейти на основе различных системных событий
  • довольно грязная (но в основном работающая) система, полная IF и SWITCH, разбросанных по всему месту

Хочу:

  • заменить текущую обработку пользовательского состояния IFfy на "умный" конечный автомат, который позволил бы определить эти пользовательские правила перехода
  • позволяет визуализировать эти определенные правила
  • делают систему более безопасной и пуленепробиваемой, гарантируя, что пользователь может находиться только в законных состояниях

Мое исследование:

Я проверил как SO, так и другие места для реализации PHP рабочего процесса и конечных автоматов, и многообещающие кандидаты кажутся

Буду признателен за любые комментарии, касающиеся любого опыта работы с любой из вышеперечисленных библиотек, и / или мнения относительно пригодности для того, что мне нужно, или за подсказки в других местах, где можно искать.

1 Ответ

1 голос
/ 04 октября 2011

В зависимости от того, как настроены ваши состояния, звучит так, как если бы вы могли просто настроить систему классов с фабрикой для элегантной обработки всего этого?

Вы также можете настроить свои классы с помощью проверки состояния, в которой вы можете генерировать исключения и, по сути, сделать невозможным создание экземпляра класса (и, следовательно, невозможно войти в это состояние).

Я думаю, что-то вроде этого может сработать для вас:

class StateFactory {
    $currentState;

    function __construct(){
        if(!isset($_SESSION['currentState'])){
            $this->currentState = 'StateOne';
        }
        else{
            $this->currentState = $_SESSION['currentState'];
        }

        $this->currentState = new {$this->currentState}->processState(); // I think something like this will work
    }

    function __deconstruct(){
        $_SESSION['currentState'] = $this->currentState;
    }
}

abstract class State{
    abstract function processState();
}

class StateOne extends State{
    function processState(){
        if(<check what is needed for this state>){
            <do what you need to do for this state>
            return 'StateTwo';
        }
        else
        {
            return 'StateWhatever';
        }
    }
}    

class StateTwo extends State{
    function processState(){
        if(<check what is needed for this state>){
            <do what you need to do for this state>
            return 'StateThree';
        }
        else
        {
            return 'StateWhatever';
        }
    }
}    

class StateThree extends State{
    ...
}

Очевидно, что многого из этого не хватает, и многое нужно сделать, чтобы превратить это в нечто, с чем вы действительно можете работать, но если вы разделите вещи таким образом, это не будет таким беспорядочным, и вы сможете знать, где проверяется каждое состояние и что проверяется.

...