gmorel / state-workflow-bundle
帮助您实现复杂且易于维护的工作流程
Requires
- php: >=5.3.3
- symfony/symfony: ~2.3
Requires (Dev)
- phpunit/phpunit: ~4
Suggests
- spec-gen/state-workflow-spec-gen-bundle: Specification generator for StateWorkflowBundle
This package is not auto-updated.
Last update: 2024-09-18 09:25:56 UTC
README
State Workflow Bundle ===================== 帮助您实现复杂且易于维护的工作流程。 ---------------------------------------------关键词:状态设计模式,工作流程,有限状态机,Symfony2
我们的 StateWorkflow 对象负责管理您给定实现 HasStateInterface 的 Entity
的所有 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(), ); // ... } // ... }
内部工作原理
致谢
许可
MIT 许可证 (MIT)
贡献
请随意增强它并分享您的想法/改进。