Конечный автомат с гвардией в PHP? - PullRequest
10 голосов
/ 29 августа 2011

Кто-нибудь знает finite state machine, который имеет охрану в PHP ?

Ответы [ 4 ]

5 голосов
/ 23 сентября 2011

Используя PEAR FSM ( пример использования ), вы можете использовать обратный вызов действия для возврата следующего состояния в случае сбоя защиты, например:

$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 голос
/ 19 ноября 2012

проверить: 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'  

Чтобы определить, где был выполнен переход, вам просто нужно сравнить предыдущее состояние с текущим состоянием.,

1 голос
/ 15 октября 2012

Посмотрите на рабочий процесс ezComponents.Позволяет проектировать рабочие процессы со многими объектами и добавлять условия и состояния.

0 голосов
/ 26 ноября 2015

Условия в Метаборе Statemachine https://github.com/Metabor/Statemachine может использоваться в качестве охраны (3-й параметр в конструкторе переходов). Смотрите пример: https://github.com/Metabor/Statemachine-Example/blob/master/Example/Order/Process/Prepayment.php

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...