kitpages/workflow-bundle

这是一个提供工作流系统的Symfony2组件。

安装: 540

依赖项: 0

建议者: 0

安全: 0

星标: 5

关注者: 7

分支: 0

公开问题: 0

类型:symfony-bundle

v1.0.0 2014-04-24 06:30 UTC

This package is auto-updated.

Last update: 2024-09-04 19:43:35 UTC


README

Build Status

此组件提供通用的工作流系统。

它已在特定项目中投入生产使用,但应被视为测试版。

用例

想象一下,你(从技术角度)管理3个不同的报纸:“纽约新闻”、“巴黎新闻”和“格勒诺布尔新闻”。

  • 对于纽约新闻,文章必须由主编唯一验证(并且作者必须重写,直到主编说可以为止)。然后它应该集成到印刷流程中。
  • 对于巴黎新闻,文章首先由秘书验证,然后由一对(来自同一领域的另一作者)和主编验证。然后它应该集成到印刷流程中。
  • 对于格勒诺布尔新闻:这是一份在线报纸。没有验证,但编辑可以稍后将其撤回。

你可以构建一个单一的、连贯的代码来管理这3个不同的业务流程。你可以通过工作流系统来实现这一点。每个报纸流程都由一个工作流配置文件表示。

此组件提供构建用于表示任何业务流程的通用工作流系统。

快速入门

  • 在config.yml中添加默认步骤
kitpages_workflow:
    default_step_name: workflow.default

kitpages_step:
    shared_step_list:
        workflow.default:
            help:
                short: "Default step"
                complete: |
                    This step always return default value
            class: Kitpages\WorkflowBundle\Step\DefaultStep
  • 使用
        // create workflow configuration
        $config='
workflow_definition:
    name: hello_world
    init_state: start_state
    state_list:
        start_state:
            event_list:
                goto_end:
                    step:
                        name: workflow.default
                    next_state:
                        default: end_state
                cancel:
                    next_state: start_state
        end_state:
            event_list:
                goto_start:
                    next_state: start_state
        ';

        // get workflow manager
        $workflowManager = $this->get("workflow.manager");

        // create workflow
        $workflowConfiguration = YamlWorkflowConfigurationParser::parse($config);
        $workflow = $workflowManager->createWorkflow("hello_world_instance_workflow", $workflowConfiguration);

        // dispatch event
        $dispatcher = $this->get('event_dispatcher');
        $actionEvent = new ActionEvent("goto_end");
        $dispatcher->dispatch(KitpagesWorkflowEvents::ACTION_EVENT, $actionEvent);

        // test workflow
        $this->assertEquals ( "end_state", $workflow->getCurrentState() );

        // back to start
        $dispatcher->dispatch(KitpagesWorkflowEvents::ACTION_EVENT, new ActionEvent("goto_start"));
        $this->assertEquals ( "start_state", $workflow->getCurrentState() );

组件状态

  • 测试版状态
  • 部分测试(60%)
  • 在travis-ci上

安装

在composer.json中添加KitpagesWorkflowBundle

{
    "require": {
        "kitpages/workflow-bundle": "~1.0"
    }
}

现在运行以下命令让composer下载组件:

$ php composer.phar update kitpages/workflow-bundle

AppKernel.php

$bundles = array(
    ...
    new Kitpages\StepBundle\KitpagesStepBundle(),
    new Kitpages\WorkflowBundle\KitpagesWorkflowBundle(),
);

config.yml中的配置非常简单

imports:
    - { resource: @KitpagesWorkflowBundle/Resources/config/steps.yml }

kitpages_workflow:
    default_step_name: workflow.default

原则

通用机制

  • 此组件用于管理状态机
  • 工作流配置定义在WorkflowConfiguration对象中
  • 机器当前状态实例在Workflow对象中
  • 工作流管理器保留每个工作流的引用,监听ActionEvents,运行步骤,更改工作流状态,...
  • 步骤包含在接收到ActionEvent后要执行的操作。然后返回的值允许根据配置决定下一个工作流状态。
  • 每个工作流状态都监听某些ActionEvent

所有操作都在步骤中完成

步骤是执行某些操作的类。步骤在GitHub上的项目中有文档:KitpagesStepBundle

我们使用扩展了AbstractWorkflowStep的步骤,它添加了对当前工作流和actionEvent的引用。

步骤示例

配置

kitpages_step:
    shared_step_list:
        my_step:
            help:
                short: "short description of my step"
                complete: |
                    Longer description
            class: Kitpages\MyBundle\Step\MyStep
            parameter_list:
                url: test.mydomain.com
            service_list:
                logger: logger

步骤代码

use Kitpages\StepBundle\Step\StepEvent;
use Kitpages\WorkflowBundle\Step\AbstractWorkflowStep;

class MyStep extends AbstractWorkflowStep {

    public function execute(StepEvent $event = null)
    {
        // get current workflow and action event
        $workflow = $this->getWorkflow();
        $actionEvent = $this->getActionEvent();

        // extract data from actionEvent
        $myValue1 = $actionEvent->get("myKey");
        $myOtherValue = $actionEvent->get("myOtherKey");

        // do someting
        $logger = $this->getService("logger");
        $logger->info("I write a log");
        $urlStepParameter = $this->getParameter("url");


        // record some values in the workflow object
        $workflow->set("resultKey", "value calculated");

        if ($someResult == true) {
            return "ok";
        } else {
            return "false";
        }
    }
}

更高级的功能

待定:要记录的功能

  • 工作流参数
  • 子工作流
  • 工作流事件和步骤事件
  • 工作流配置快捷方式
  • 工作流持久化
  • 并行多个工作流

版本

  • 2014/04/24:v1.0.0 - 第一个稳定版本

路线图

1.x版本保持向后兼容性。

到2014年6月

  • 更多测试和文档
  • 服务中的yaml解析器(静态调用将保持但已弃用)
  • 代理系统的预生成和缓存

以后

  • 一个友好的调试界面