PHP中的用户状态工作流引擎

时间:2011-10-04 15:24:35

标签: php workflow user-management

我希望在PHP应用程序中实现用户状态/工作流处理。

目前有:

  • 基于用户的系统,具有大约10种不同状态,任何用户都可以进入(启用,禁用,预注册,取消注册,删除等)。
  • 根据不同的系统事件定义了关于用户可以去哪个州的规则
  • 一个相当混乱(但主要是工作)的系统,充满了分布在整个地方的IF和SWITCH。

想:

  • 使用“聪明”状态机替换当前的IFfy用户状态处理,以便定义这些用户转换规则
  • 允许显示那些已定义的规则
  • 通过确保用户只能处于合法状态,使系统更加安全和防弹

我的研究:

我检查了SO和其他地方的工作流程和状态机的PHP实现,而有希望的候选人似乎是

如果您对上述任何一个图书馆的工作经验和/或有关我需要的适用性的意见或对其他地方的提示有任何意见,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

根据您的状态设置,听起来像您可以设置一个带工厂的类系统来优雅地处理所有这些?

您还可以使用状态检查来设置类,您可以抛出异常并基本上无法实例化类(因此无法进入该状态)。

我认为这样的事可能适合你:

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{
    ...
}

显然有很多东西从这里缺失,并且需要做很多工作才能使这成为你可以实际使用的东西,但是如果你这样分开,它就不会那么混乱你将能够知道每个州的检查地点以及检查的内容。