metabor/statemachine

PHP 5.3 中的状态机

v2.0.4 2019-06-13 08:39 UTC

README

PHP 5.6 / PHP 7 中的状态机

支持

Gitter

Gitter chat

持续集成/部署

TravisCI

Build Status

开放问题

Open Issues

包信息

Packagist

Packagist Packagist Packagist Packagist

兼容性

MetaborStd Version

依赖状态

VersionEye

Dependency Status

测试覆盖率

Scrutinizer

Code Coverage

代码质量

Codeship

Codeship Status

Codacy

Codacy

Code Climate

Code Climate

Scrutinizer

Scrutinizer Code Quality

SensioLabsInsight

SensioLabsInsight

其他

License Gittip

快速入门示例

安装后,让我们使用一个示例状态机 安装

<?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 “图形可视化软件”来可视化流程图。

安装

安装此库的推荐方法是 通过 composercomposer 是什么?

{
    "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 许可证 的条款下发布。