runner/heshen
最新稳定版本:v1.0.3
Composer 安装命令:
composer require runner/heshen
包简介
finite state machine
README 文档
README
Finite-state Machine In PHP
Features
- 基于 Stateful 对象绑定 Graph
- Transition 事件监听
- 便捷的 Transition Checker
- 以上都在瞎扯淡
Documentation
none
Usage
先定义 Stateful 对象
<?php use Runner\Heshen\Contracts\StatefulInterface; class Document implements StatefulInterface { protected $state = 'a'; public function getState(): string { return $this->state; } public function setState(string $state): void { echo "\nsetting\n"; $this->state = $state; } }
然后定义一个 Blueprint 来配置 Transition 及 State
<?php use Runner\Heshen\Blueprint; use Runner\Heshen\State; use Runner\Heshen\Contracts\StatefulInterface; class Graph extends Blueprint { protected function configure(): void { $this->addState('a', State::TYPE_INITIAL); $this->addState('b', State::TYPE_NORMAL); $this->addState('c', State::TYPE_NORMAL); $this->addState('d', State::TYPE_FINAL); $this->addTransition('one', 'a', 'b'); $this->addTransition('two', 'b', 'c', function (StatefulInterface $stateful, array $parameters) { return ($parameters['number'] ?? 0) > 5; }); } protected function preOne(StatefulInterface $stateful, array $parameters = []) { echo "before apply transition 'one'\n"; } protected function postOne(StatefulInterface $stateful, array $parameters = []) { echo "after apply transition 'one'\n"; } }
开始使用!
<?php use Runner\Heshen\Machine; $machine = new Machine(new Document, new Graph); var_dump($machine->can('one')); // output: bool(true) var_dump($machine->can('two')); // output: bool(false) $machine->apply('one'); /* * output: * before apply transition 'one' * after apply transition 'one' */ var_dump($machine->can('two', ['number' => 1])); // output: bool(false) var_dump($machine->can('two', ['number' => 6])); // output: bool(true)
通过 Factory 获取 Machine
<?php use Runner\Heshen\Factory; $factory = new Factory([ Document::class => Graph::class, ]); $document = new Document; $machine = $factory->make($document); var_dump($machine->can('one')); // output: bool(true)
Tips
在实现 StatefulInterface::setState() 时, 如有需要, 应当使用锁避免冲突.
统计信息
- 总下载量: 3.11k
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 19
- 点击次数: 2
- 依赖项目数: 2
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2018-02-27