gmorel/state-workflow-bundle

帮助您实现复杂且易于维护的工作流程

安装: 417

依赖: 3

建议者: 0

安全: 0

星标: 5

关注者: 2

分支: 0

开放问题: 0

类型:symfony-bundle

1.0.0 2015-05-03 14:51 UTC

This package is not auto-updated.

Last update: 2024-09-18 09:25:56 UTC


README

StateWorkflowBundle logo

State Workflow Bundle =====================

Build Status Scrutinizer Code Quality Code Coverage Dependency Status Latest Stable Version License

Symfony 2

帮助您实现复杂且易于维护的工作流程。 ---------------------------------------------

关键词:状态设计模式,工作流程,有限状态机,Symfony2

Workflow

我们的 StateWorkflow 对象负责管理您给定实现 HasStateInterfaceEntity 的所有 States 和其 Transitions。每个状态都是一个实现我们的 StateInterface 的类,并管理自己的转换。

通用语言

  • 状态:在给定时间点的实体有限状态(例如:预订已付款报价已取消等..)
  • 转换:状态A到状态B之间的转换(例如:预订等待付款 --发送确认邮件-> 预订已付款等..)

优点

  • 您的工作流程通过类进行描述
  • 每个状态都负责其 自己的转换
  • 每个状态转换可以包含 逻辑(日志记录,事件溯源,断言,发送邮件等..)
  • 状态是 Symfony2 服务
  • 您的工作流程可以轻松地进行 单元测试
  • 实体的当前状态可以轻松存储在数据库中(简单的字符串)
  • 可以从代码库 生成 工作流程 规范文件

缺点

  • 每次您添加转换时,都必须修改您自己的接口,该接口扩展了我们的 StateInterface 实现
  • 如果您只需要没有逻辑的有限状态机,您可能更喜欢 https://github.com/yohang/Finite
  • 并不真正遵循著名的格言:“宁选组合而非继承” ..

### 用法

$bookingWorkflow = $this->get('demo.booking_engine.state_workflow');

// Initialize entity state to booking workflow default state : incomplete
// `Booking::__construct` contains `$bookingWorkflow->getDefaultState()->initialize($this);`
$booking = new Booking($bookingWorkflow, 200);

// Set incomplete Booking as paid
// Take care of the state transition (incomplete -> paid) - Send confirmation mail
$booking->getState($bookingWorkflow)
    ->setBookingAsPaid($booking);

// Get current booking state : StatePaid
$currentState = $booking->getState($bookingWorkflow);

使用以下服务声明

<!-- Booking Workflow -->
<service id="demo.booking_engine.state_workflow" class="Gmorel\StateWorkflowBundle\StateEngine\StateWorkflow" public="false">
    <argument>Booking Workflow</argument>
    <argument>demo.booking_engine.state_workflow</argument>
    <tag name="gmorel.state_workflow_bundle.workflow" />
</service>

<!-- Booking States -->
<service id="demo.booking_engine.state.incomplete" class="BookingEngine\Domain\State\Implementation\StateIncomplete" public="false">
    <tag name="demo.booking_engine.state" />
</service>

<service id="demo.booking_engine.state.waiting_payment" class="BookingEngine\Domain\State\Implementation\StateWaitingPayment" public="false">
    <tag name="demo.booking_engine.state" />
</service>

<!-- ... -->

实现示例

预订演示 https://github.com/gmorel/StateWorkflowDemo

详细信息

它将允许您管理 States 以及它们的可用 Transitions(例如,一个预订类)。目标是帮助实现复杂的 Workflow,其中每个实现我们的 StateInterface 接口的 State 负责其 Transitions(方法)到其他 State。某些转换可能是不可能的(不是您的工作流程的一部分),因此在调用时抛出 UnsupportedStateTransitionException 异常。

每个 State 都有一个 Symfony2 服务 标签

<service id="demo.booking_engine.state.paid" class="BookingEngine\Domain\State\Implementation\StatePaid" public="false">
    <tag name="demo.booking_engine.state" />
</service>

这种方式,您可以通过使用其他Symfony2 标签来管理不同 Entities 可用的 States,因为预订、内容和客户实体不共享相同的 Workflow/States)。然后,您需要修改Symfony2 编译器Pass,以便让您的 Workflow 了解其 States

添加新状态

如果您想添加一个新 State,您需要创建一个新的类,实现我们的接口StateInterface

添加新转换

如果您想添加一个新 Transition,您需要在您的XXXStateInterface中添加一个新的方法,该接口扩展了我们的StateInterface。您还可以使用我们的助手AbstractState,该助手将实现默认行为,例如抛出我们的UnsupportedStateTransitionException

安装

步骤 1:下载 Bundle

打开命令行控制台,进入您的项目目录,并执行以下命令以下载此 Bundle 的最新稳定版本

$ composer require gmorel/state-workflow-bundle "~1.0"

此命令要求您全局安装 Composer,如 Composer 文档的安装章节中所述。

步骤 2:启用 Bundle

然后,通过在您的项目的 app/AppKernel.php 文件中添加以下行来启用 Bundle

<?php
// app/AppKernel.php

// ...
class AppKernel extends Kernel
{
    public function registerBundles()
    {
        $bundles = array(
            // ...
            new Gmorel\StateWorkflowBundle\GmorelStateWorkflowBundle(),
        );
        // ...
    }

    // ...
}

内部工作原理

UML

致谢

许可

MIT 许可证 (MIT)

贡献

请随意增强它并分享您的想法/改进。