szykra/state-machine

简单的有限状态机实现

0.1.0 2015-08-20 11:40 UTC

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

通过添加StatesTransitions来配置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