slava-basko / finite-state-machine
Installs: 1
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/slava-basko/finite-state-machine
Requires
- php: >=5.5|^7|^8
Requires (Dev)
- phpunit/phpunit: 4 - 9
- squizlabs/php_codesniffer: >=3
Suggests
- slava-basko/specification-php: Specification as guards in your transitions
README
PHP State Machine.
Control transition of your entity from one state to another.
$stateDraft = new State('draft'); $stateReview = new State('review'); $stateApproved = new State('approved'); $stateRejected = new State('rejected'); $stateEditing = new State('editing'); $statePublished = new State('published'); $transitionToReview = new Transition('to_review', [$stateDraft, $stateEditing], $stateReview); $transitionToApproved = new Transition('to_approved', [$stateReview], $stateApproved); $transitionToRejected = new Transition('to_rejected', [$stateReview], $stateRejected); $transitionToEditing = new Transition('to_editing', [$stateReview], $stateEditing); $transitionToPublished = new Transition('to_published', [$stateApproved], $statePublished); class Post { public $state = 'draft'; } $stateMachine = new StateMachine( function (Post $post) { return new State($post->state); }, function (Post $post, StateInterface $newState) { $post->state = $newState->getName(); } ); $stateMachine->addTransitions([ $transitionToReview, $transitionToApproved, $transitionToRejected, $transitionToEditing, $transitionToPublished, ]); $post = new Post(); $stateMachine->transition('to_review', $post); // Ok $stateMachine->transition('to_published', $post); // NoSuitableTransitionException