Я написал конечный автомат для php. Я уверен, что вы уже давно нашли решение для этого. Но для людей, посещающих эту страницу, вы можете попробовать этот конечный автомат.
https://github.com/definitely246/state-machine
Чтобы использовать его, вы определяете обработчики событий перехода как классы. Тогда вам нужно определить переходы. Конечный автомат может быть сконфигурирован для выполнения других задач, но вот основы.
class Event1ChangedState1ToState2
{
public function allow($context)
{
return true;
}
public function handle($context)
{
if (!$context->statesChanged) $context->statesChanged = 0;
print "state1 -> state2\n";
return $context->statesChanged++;
}
}
class Event1ChangedState2ToState1
{
public function allow($context)
{
return true;
}
public function handle($context)
{
print "state2 -> state1\n";
return $context->statesChanged++;
}
}
Затем вы можете определить переходы, которые изменяют состояния при запуске события.
$transitions = [
[ 'event' => 'event1', 'from' => 'state1', 'to' => 'state2', 'start' => true],
[ 'event' => 'event1', 'from' => 'state2', 'to' => 'state1' ],
];
$fsm = new StateMachine\FSM($transitions);
print $fsm->state() . PHP_EOL; // 'state1'
$fsm->event1(); // returns 1, prints 'state1 -> state2'
print $fsm->state() . PHP_EOL; // 'state2'
$fsm->event1(); // returns 2, prints 'state2 -> state1'
print $fsm->state() . PHP_EOL; // 'state1'
Вы можете установить с композитором
composer require definitely246/state-machine