cawaphp/statemachine

此包已被弃用,且不再维护。未建议替代包。

Сáша 状态机

dev-master 2018-02-14 20:37 UTC

This package is not auto-updated.

Last update: 2023-12-23 16:01:12 UTC


README

警告

请注意,此包仍在积极开发中。可能会发生一些破坏性更改。感谢您的理解。

特性

  • 状态 > 可以有 X 个转换 > 可以有 X 个条件
  • getPossibleTransitions() 根据当前状态返回可能的转换
  • getGraph() 状态机图
  • apply($state) 返回 true 或抛出详细异常
  • apply($state, true) 返回 bool
  • 事件
    • 状态更改前
    • 状态更改后

基本用法

// Declare the state machine 
$stateMachine = new StateMachine("PENDING", new \stdClass());

$stateMachine->addState((new State("PENDING"))
    ->addTransition(new Transition("TOCONFIRM"))
    ->addTransition(new Transition("CONFIRMED"))
);

$stateMachine->addState((new State("TOCONFIRM"))
    ->addTransition(new Transition("CONFIRMED"))
    ->addTransition(new Transition("CANCELED"))
);

$returnTrue = new class extends Condition
{
    public function __invoke($subject) : bool
    {
        return true;
    }
};

$returnFalse = new class extends Condition
{
    public function __invoke($subject) : bool
    {
        return false;
    }
};

$stateMachine->addState((new State("READY"))
    ->addTransition((new Transition("CONFIRMED"))
        ->addCondition($returnFalse)
    )
    ->addTransition((new Transition("PROCESSED"))
        ->addCondition($returnTrue)
    )
    ->addTransition(new Transition("RETURN"))
);

$stateMachine
    ->addState(new State("PROCESSED"))
    ->addState(new State("CANCELED"))
    ->addState(new State("RETURN"));

// play with state

var_dump($stateMachine->getCurrentState()->getName());
// string(7) "PENDING"

$stateMachine->apply("TOCONFIRM");
var_dump($stateMachine->getCurrentState()->getName());
// string(9) "TOCONFIRM"

var_dump($stateMachine->apply("RETURN", true));
// bool(false)
var_dump($stateMachine->getLastException());
// object(Cawa\StateMachine\Exceptions\MissingTransition)#103 (7) {
//   ...
// }

var_dump($stateMachine->getPossibleTransitions());
// array(2) {
//   [0]=>
//   string(9) "CONFIRMED"
//   [1]=>
//   string(8) "CANCELED"
// }

var_dump($stateMachine->getGraph());
// string(369) "digraph G {
//   "PENDING" -> "TOCONFIRM"
//   "PENDING" -> "CONFIRMED"
//   "TOCONFIRM" -> "CONFIRMED"
//   "TOCONFIRM" -> "CANCELED"
//   "READY" -> "CONFIRMED" [label="if (class@anonymous/Test.php0x7fd8eb47c50a)"]
//   "READY" -> "PROCESSED" [label="if (class@anonymous/Test.php0x7fd8eb47c451)"]
//   "READY" -> "RETURN"
// }
// "

方法 getGraph()

此方法返回原始 GraphViz,您可以使用官方 dot 可执行文件(sudo apt-get install graphviz)或使用 此网页界面

许可证

Cawa 在 GPL v3 许可证下发布 - 请参阅 LICENSE 文件以获取详细信息