有人知道 PHP 中有后卫功能的finite state machine
吗?
答案 0 :(得分:5)
使用PEAR's FSM(usage example),如果防护失败,您可以使用动作回调返回下一个状态,如下所示:
$payload = '';
$fsm = new FSM('STATE1', $payload);
function guard1($symbol, $payload) {
if ($payload == 'something') {
// Guard success, allow transition
return;
}
else {
// Guard fail, return to previous state
return 'STATE1';
}
}
$fsm->addTransition('SYMBOL1', 'STATE1', 'STATE2', 'guard1');
$fsm->process('SYMBOL1');
答案 1 :(得分:1)
查看ezComponents工作流程。允许您设计包含许多对象的工作流并添加条件和状态。
答案 2 :(得分:1)
退房: https://github.com/chriswoodford/techne/tree/v0.2
我认为它具有您正在寻找的功能。您可以定义转换,然后关联在处理转换之前调用的闭包。这是一个简单的例子:
$machine = new StateMachine\FiniteStateMachine();
$machine->setInitialState('off');
$turnOff = new StateMachine\Transition('on', 'off');
$turnOn = new StateMachine\Transition('off', 'on');
// flipping the switch on requires electricity
$hasElectricity = true;
$turnOn->before(function() use ($hasElectricity) {
return $hasElectricity ? true : false;
});
$machine->flip();
echo $machine->getCurrentState();
// prints 'on'
$machine->flip();
echo $machine->getCurrentState();
// prints 'off'
// oops, forgot to pay that electricity bill
$hasElectricity = false;
$turnOn->before(function() use ($hasElectricity) {
return $hasElectricity ? true : false;
});
$machine->flip();
echo $machine->getCurrentState();
// prints 'off'
为了确定过渡完成的位置,您只需将先前的状态与当前状态进行比较。
答案 3 :(得分:0)
Metabor Statemachine中的条件 https://github.com/Metabor/Statemachine 可以用作Guards(Transition构造函数中的第3个参数)。 见例子: https://github.com/Metabor/Statemachine-Example/blob/master/Example/Order/Process/Prepayment.php