В зависимости от того, как настроены ваши состояния, звучит так, как если бы вы могли просто настроить систему классов с фабрикой для элегантной обработки всего этого?
Вы также можете настроить свои классы с помощью проверки состояния, в которой вы можете генерировать исключения и, по сути, сделать невозможным создание экземпляра класса (и, следовательно, невозможно войти в это состояние).
Я думаю, что-то вроде этого может сработать для вас:
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{
...
}
Очевидно, что многого из этого не хватает, и многое нужно сделать, чтобы превратить это в нечто, с чем вы действительно можете работать, но если вы разделите вещи таким образом, это не будет таким беспорядочным, и вы сможете знать, где проверяется каждое состояние и что проверяется.