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

1.0.0 2025-10-04 03:36 UTC

This package is auto-updated.

Last update: 2025-10-04 03:40:26 UTC


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

fsm-example.jpg