argens / finite
A simple PHP Finite State Machine
dev-master / 1.3.x-dev
2024-09-03 17:23 UTC
Requires
- php: >=8.1
- jbzoo/ci-report-converter: ^7.2
- symfony/event-dispatcher: ^7.0
- symfony/options-resolver: ^7.0
- symfony/property-access: ^7.0
Requires (Dev)
- phpstan/phpstan: ^1.12
- phpunit/phpunit: ^8.5.25
- pimple/pimple: ^1.1.1
- spaze/phpstan-disallowed-calls: ^3.4
- symfony/dependency-injection: ^7.0
- symfony/framework-bundle: ^7.0
- symfony/security-bundle: ^7.0
- symfony/serializer: ^7.0
- twig/twig: ^2.0|^3.0
Suggests
- pimple/pimple: Needed for use with PimpleFactory
- symfony/security: Needed for using SecurityAwareStateMachine
- symfony/serializer: Needed for the use of the normalizer
- symfony/yaml: Yaml allows you to define your State graph in YAML
This package is auto-updated.
Last update: 2024-12-03 17:47:54 UTC
README
Finite is a Simple State Machine, written in PHP. It can manage any Stateful object by defining states and transitions between these states.
Features
- Managing State/Transition graph for an object
- Defining and retrieving properties for states
- Event Listenable transitions
- Symfony2 integration
- Custom state graph loaders
- Twig Extension
Documentation
Documentation for master (1.1)
Getting started
Installation (via composer)
{ "require": { "yohang/finite": "~1.1" } }
Version note :
If your are using this library in a Symfony project, 1.1 version is only compatible with Symfony >=2.6
.
1.0 is compatible with Symfony >=2.3, <2.6
.
Define your Stateful Object
Your stateful object just need to implement the StatefulInterface
Interface.
use Finite\StatefulInterface; class Document implements StatefulInterface { private $state; public function setFiniteState($state) { $this->state = $state; } public function getFiniteState() { return $this->state; } }
Initializing a simple StateMachine
use Finite\StateMachine\StateMachine; use Finite\State\State; use Finite\State\StateInterface; // $document = retrieve your stateful object $sm = new StateMachine(); // Define states $sm->addState(new State('s1', StateInterface::TYPE_INITIAL)); $sm->addState('s2'); $sm->addState('s3'); $sm->addState(new State('s4', StateInterface::TYPE_FINAL)); // Define transitions $sm->addTransition('t12', 's1', 's2'); $sm->addTransition('t23', 's2', 's3'); $sm->addTransition('t34', 's3', 's4'); $sm->addTransition('t42', 's4', 's2'); // Initialize $sm->setObject($document); $sm->initialize(); // Retrieve current state $sm->getCurrentState(); // Can we process a transition ? $sm->can('t34');