sokil / php-state
状态机
0.5.3
2020-02-13 13:08 UTC
Requires
- php: >=5.4
Requires (Dev)
- phpunit/phpunit: >=4.8.35 <6.0
- satooshi/php-coveralls: >=0.7.1 <2.0
- symfony/yaml: >=2.0 <6.0
Suggests
- symfony/yaml: YAML parser from Symfony
This package is auto-updated.
Last update: 2024-09-18 01:36:29 UTC
README
PHP上的有限状态机实现。
安装
您可以通过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
文件中。