проверить: https://github.com/chriswoodford/techne/tree/v0.2
Я думаю, что он имеет ту функциональность, которую вы ищете.Вы определяете переход и затем можете связать замыкание, которое вызывается перед обработкой перехода.Вот простой пример:
Определите свой FSM
$machine = new StateMachine\FiniteStateMachine();
$machine->setInitialState('off');
Определите переходы
$turnOff = new StateMachine\Transition('on', 'off');
$turnOn = new StateMachine\Transition('off', 'on');
Добавьте защиту к переходу turnOn
// 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'
, если для переменной $ hasElectricity было установлено значение false, результат будет выглядеть следующим образом:
// 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'
Чтобы определить, где был выполнен переход, вам просто нужно сравнить предыдущее состояние с текущим состоянием.,