metabor / statemachine
PHP 5.3 中的状态机
Requires
- php: >=5.3
- metabor/metabor-std: ~2.0.0
Requires (Dev)
Suggests
- clue/graph: For displaying process graph
- graphp/graphviz: For displaying process graph
- metabor/statemachine-doctrine-bridge: Integrates Doctrine to persit and define status and processes for the statemachine
- symfony/expression-language: To use symfony expressions as conditions
README
PHP 5.6 / PHP 7 中的状态机
支持
Gitter
持续集成/部署
TravisCI
开放问题
包信息
Packagist
兼容性
依赖状态
VersionEye
测试覆盖率
Scrutinizer
代码质量
Codeship
Codacy
Code Climate
Scrutinizer
SensioLabsInsight
其他
快速入门示例
安装后,让我们使用一个示例状态机 安装
<?php require_once 'vendor/autoload.php'; use Metabor\Statemachine\Process; use Metabor\Statemachine\State; use Metabor\Statemachine\Statemachine; use Metabor\Statemachine\Transition; $closed = new State('closed'); $opened = new State('opened'); $eventOpen = 'open'; $eventClose = 'close'; $closed->addTransition(new Transition($opened, $eventOpen)); $closed->addTransition(new Transition($closed, $eventClose)); $opened->addTransition(new Transition($opened, $eventOpen)); $opened->addTransition(new Transition($closed, $eventClose)); // adding some action to events // the parts of observing the event and executing the command are separated in this example // normaly it could be put all together into your own command (base)class $openCommand = new \Metabor\Callback\Callback( function () { echo 'motor is opening door' . PHP_EOL; }); $observerForOpenEvent = new \Metabor\Observer\Callback($openCommand); $closed->getEvent($eventOpen)->attach($observerForOpenEvent); $closeCommand = new \Metabor\Callback\Callback( function () { echo 'motor is closing door' . PHP_EOL; }); $observerForCloseEvent = new \Metabor\Observer\Callback($closeCommand); $opened->getEvent($eventClose)->attach($observerForCloseEvent); // stateful subject that belongs to this statemachine $subject = new stdClass(); // start process with closed status; $initialState = $closed; $process = new Process('process name', $initialState); $statemachine = new Statemachine($subject, $process); echo 'Status:' . $statemachine->getCurrentState()->getName() . PHP_EOL; echo 'Event:' . $eventOpen . PHP_EOL; $statemachine->triggerEvent($eventOpen); echo 'Status:' . $statemachine->getCurrentState()->getName() . PHP_EOL; // opening an open door would not activate the motor echo 'Event:' . $eventOpen . PHP_EOL; $statemachine->triggerEvent($eventOpen); echo 'Status:' . $statemachine->getCurrentState()->getName() . PHP_EOL; echo 'Event:' . $eventClose . PHP_EOL; $statemachine->triggerEvent($eventClose); echo 'Status:' . $statemachine->getCurrentState()->getName() . PHP_EOL;
特性
此库在 PHP 5.3 中实现了有限状态机。
它最初是为一次会议演讲开发的。我的演讲示例可以在 Github 和 Packagist 上找到,作为 metabor/statemachine-example。
在 MetaborStd 命名空间中定义了一些抽象类型,这些类型在此项目中得到了示例实现。如果你需要在项目中实现或使用状态机,你可以自由地使用此库,或者使用 MetaborStd 接口替换不符合你需求的部分。
流程图绘制
此库支持使用 clue/graph 和 GraphViz “图形可视化软件”来可视化流程图。
安装
安装此库的推荐方法是 通过 composer。 composer 是什么?
{ "require": { "metabor/statemachine": "~1.2" } }
可选推荐:为了能够使用 流程图绘制功能,你必须安装 GraphViz(dot
可执行文件)。基于 Debian/Ubuntu 的发行版的用户可以简单地调用 sudo apt-get install graphviz
,Windows 用户需要 下载 GraphViZ for Windows,其他用户应从 GraphViz 主页 安装。要使用此功能,你还需要将其添加到你的 composer.json
{ "require": { "graphp/graphviz": "*", "clue/graph": "*", "metabor/statemachine": "~1.2" } }
如何在 metabor/statemachine-example 中绘制和显示图形的示例,可以在 metabor/statemachine-example 中找到。
测试
此库使用 phpunit 进行广泛的测试。你可以使用全局安装或依赖你在首次运行 $ composer install
时 composer 安装的版本。这将设置开发环境,因此你现在可以从项目根目录运行它。
$ php vendor/bin/phpunit
贡献
如果你遇到任何问题,请随时给我们留言,提交错误报告,甚至最好提供补丁/拉取请求以及/或单元测试来重现你的问题。
除了直接与代码一起工作之外,任何额外的文档、对我们的 README 的补充,甚至是修正简单的错别字都同样受欢迎。
任何反馈和/或贡献都受欢迎!
许可证
在宽松的 MIT 许可证 的条款下发布。