szykra / state-machine
简单的有限状态机实现
0.1.0
2015-08-20 11:40 UTC
Requires (Dev)
- phpunit/phpunit: ~4.8
This package is auto-updated.
Last update: 2024-09-12 20:10:59 UTC
README
有限状态机的PHP实现
安装
通过Composer安装
将依赖添加到您的composer.json
文件中,并运行composer update
。
"szykra/state-machine": "~0.1.0"
或者直接运行
composer require szykra/state-machine
使用方法
准备您的实体以使其具有状态
您的实体应该实现StatefulInterface
接口。它需要两个新方法
public function getState();
public function setState($state);
当然,您应该添加一个新的属性,例如state。
通过添加States和Transitions来配置StateMachine
通过StateMachine控制您的实体,您必须定义
- 状态
- 状态之间的转换
状态
状态对象简单地表示一个状态。它有名称和可用转换的列表。
$stateDraft = new State('draft'); $statePublished = new State('published');
转换
转换类似于某人执行在对象上的单个动作。这意味着从一个状态转换到另一个状态。
$stateDraft->addTransition('publish', 'draft', 'published'); $transitionReject = new Transition('reject', 'published', 'rejected'); $statePublished->putTransition($transitionReject);
每个状态都有自己的转换,因此可用的转换取决于对象的当前状态。
状态机
状态机是一个用于更改状态对象状态的控制器。首先,您应该创建一个StateMachine对象,并通过添加有效的States来设置它。
$stateMachine = new StateMachine(); // api inconsistent, should called putState $stateMachine->addState($stateDraft); $stateMachine->addState($statePublished);
初始化状态机
当您的StateMachine准备好后,您可以通过Stateful Object来初始化它。
$document = new Document(); $stateMachine->initialize($document);
现在,您可以通过$stateMachine
更改$document
的状态。要检查是否可以执行转换,请使用can($transition)
方法,例如,如果$document
的当前状态是draft,则结果如下
$stateMachine->can('publish'); // true $stateMachine->can('reject'); // false
要更改对象的状态,请使用run($transition)
方法。如果转换不存在,将抛出TransitionNotFoundException
。
echo $document->getState(); // draft $stateMachine->run('publish'); echo $document->getState(); // published
要查看完整的示例,请参阅tests/目录。
待办事项
- 在状态更改前后设置回调功能
- 列出所有状态
- 列出所有转换
- 添加可配置的加载器到状态机
- 为转换添加可配置的条件
许可证
MIT许可证。版权所有©2015,由Szymon Krajewski