szykra/state-machine

Simple Finite State Machine implementation

0.1.0 2015-08-20 11:40 UTC

This package is auto-updated.

Last update: 2024-11-12 20:32:25 UTC


README

Finite State Machine implementation in PHP

Installation

Install via composer

Add dependency to your composer.json file and run composer update.

"szykra/state-machine": "~0.1.0"

or just run

composer require szykra/state-machine

Usage

Prepare your entity to be stateful

Your entity should implements interface StatefulInterface. It requires two new methods

  • public function getState();
  • public function setState($state);

Of course you should add new property named e.g. state.

Configure a StateMachine by adding States and Transitions

To control your entity by StateMachine you have to define:

  • States
  • Transitions between States

State

State object simply represents a state. It has name and list of available transitions.

$stateDraft = new State('draft');
$statePublished = new State('published');

Transition

Transition is like single action which someone performs on an object. It means transition from one state to another state.

$stateDraft->addTransition('publish', 'draft', 'published');

$transitionReject = new Transition('reject', 'published', 'rejected');
$statePublished->putTransition($transitionReject);

Each state has own transitions so available transitions depend on the current state of object.

StateMachine

StateMachine is a controller used to change state of stateful object. First you should create a StateMachine object and set up it by adding a valid States.

$stateMachine = new StateMachine();

// api inconsistent, should called putState
$stateMachine->addState($stateDraft);
$stateMachine->addState($statePublished);

Initialize a State Machine

When your StateMachine is ready you could initialize it by Stateful Object.

$document = new Document();
$stateMachine->initialize($document);

Now you could change state of $document by $stateMachine. To check if transition can be performed use the can($transition) method, e.g. if current state of $document is draft the results will be as follows

$stateMachine->can('publish'); // true
$stateMachine->can('reject'); // false

To change state of object you should use run($transition) method. If transition not exists TransitionNotFoundException will be thrown.

echo $document->getState();    // draft
$stateMachine->run('publish');
echo $document->getState();    // published

If you want to see a complete example please see tests/ directory.

To do

  • Ability to setup callbacks before/after change states
  • List all states
  • List all transitions
  • Add configurable loader to StateMachine
  • Add configurable conditionals to transitions

License

The MIT License. Copyright © 2015 by Szymon Krajewski