5

PHP アプリケーションでユーザー状態/ワークフロー処理を実装しようとしています。

現在持っている:

  • 約 10 の異なる状態を持つユーザーベースのシステム (有効、無効、事前登録、登録解除、削除など)。
  • さまざまなシステム イベントに基づいてユーザーが移行できる状態に関する定義済みのルール
  • あちこちに散らばっている IF と SWITCH でいっぱいのかなり厄介な (しかしほとんどは機能している) システム

をしたい:

  • 現在のIFfyユーザー状態処理を、それらのユーザー遷移ルール​​を定義できる「賢い」状態マシンに置き換えます
  • 定義されたルールを視覚化できるようにする
  • ユーザーが合法的な状態にのみなれるようにすることで、システムをより安全で防弾にします

私の研究:

ワークフローとステート マシンの PHP 実装について SO と他の場所の両方をチェックしましたが、有望な候補は次のようです。

上記のライブラリのいずれかを使用した経験に関するコメント、および/または必要なものへの適合性に関する意見、または他の場所へのヒントについての意見に感謝します。

4

1 に答える 1

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

明らかに、これには多くのものが欠けており、これを実際に作業できるものにするために多くのことを行う必要がありますが、このように分割すると、それほど面倒ではなくなり、それぞれがどこにあるかを知ることができます。状態がチェックされており、何がチェックされているか。

于 2011-10-04T16:45:33.580 に答える