sokil/php-state

状态机

0.5.3 2020-02-13 13:08 UTC

This package is auto-updated.

Last update: 2024-09-18 01:36:29 UTC


README

PHP上的有限状态机实现。

Latest Stable Version Total Downloads Build Status Coverage Status

安装

您可以通过Composer安装库

{
    "require": {
        "sokil/php-state": "dev-master"
    }
}

基本用法

<?php

// create state machine builder
$machineBuilder = new MachineBuilder();

// configure states
$machineBuilder
    ->addState(function(StateBuilder $builder) {
        $builder->setName('new');
    })
    ->addState(function(StateBuilder $builder) {
        $builder
            ->setName('in_progress')
            ->setMetadata([
                'label' => 'In progress'
            ]);
    })
    ->addState(function(StateBuilder $builder) {
        $builder->setName('done');
    });
    
// set initial state
$machineBuilder->setInitialState('new');

// configure transitions between states
$machineBuilder
    ->addTransition(function(TransitionBuilder $builder) {
        $builder
            ->setName('set_in_progress')
            ->setInitialStateName('new')
            ->setResultingStateName('in_progress')
            ->setAcceptCondition(function() {
                // conditions when accepted to transit from "new" state to "in_progress"
                return true;
            });
    })
    ->addTransition(function(TransitionBuilder $builder) {
        $builder
            ->setName('set_done')
            ->setInitialStateName('in_progress')
            ->setResultingStateName('done');
    });
    
// create machine
$machine = $machineBuilder->getMachine();

// process transition
$state = $machine->process('set_in_progress')->getCurrentState();

配置

机器可以直接在代码中进行配置,如上示例。但也可以通过不同格式的配置文件进行配置。目前支持YAML、JSON和PHP数组文件。配置示例可在此处查看here

通常,配置的结构是

stateName1:
  initial: true
  transitions:
    transition1Name:
      resultingState: stateName2
    to_rejected:
      resultingState: stateName3

stateName2:
  transitions:
  ...
<?php

// YAML
$configuration = new YamlConfiguration('config.yaml');

// PHP Array
$configuration = new ArrayConfiguration('config.php');
// or
$configuration = new ArrayConfiguration([...state configuration...]);

// JSON
$configuration = new JsonConfiguration('config.json');

// Configure
$machineBuilder = new MachineBuilder();
$machine = $machineBuilder->configure($configuration)->getMachine();

默认情况下,YamlConfiguration使用pecl扩展,但如果在服务器上无法安装此扩展,您可以使用Symfony的YAML组件

<?php
$configuration = new YamlConfiguration('config.yaml', ['pecl' => false]);

这也要求您将symfony/yaml依赖项添加到您的composer.json文件中。