我需要实施一个工作流程系统。
例如,要导出一些数据,我需要:
我开始创建两种类型的Workflow,它负责添加新的Step对象并运行它。
每个步骤实现一个StepInterface。
我主要担心的是我的所有步骤都依赖于前一个步骤(第一个除外),我想知道处理这些问题的最佳方法是什么。
我虽然循环每个步骤并为每个步骤提供前一个步骤(如果有的话),但我对此并不满意。
另一个想法是允许将“上一步”设置为步骤,例如:
$s = new Step();
$s->setPreviousStep(Step $step);
但是我失去了Workflow类的实用程序。
任何想法,建议?
顺便说一下,我也关注整个工作流程的成功或失败,这意味着如果任何步骤失败,我需要回滚或清理以前的数据。
答案 0 :(得分:4)
我去年实现了类似的工作流引擎(虽然是封闭的源代码 - 所以没有我可以共享的代码)。以下是基于该经验的一些想法:
您可能还需要考虑以下内容 - 如果这是您计划作为大型服务/服务器实施的内容:
答案 1 :(得分:1)
回滚可以很容易地适应这个结构,因为每个Step
将实现自己的rollback()
方法,如果任何步骤失败,工作流可以调用(最好以相反的顺序)。< / p>
至于主要问题,这实际上取决于你想要多么复杂。在基本级别,您可以定义StepResult
接口,该接口由每个步骤返回并传递给下一个接口。这种方法的明显问题是每个步骤都应该“知道”期望StepResult
的实现。对于小型系统,这可能是可以接受的,对于较大的系统,您可能需要某种可配置的映射框架,可以告诉您如何将上一步的结果转换为下一步的输入。因此Workflow
会调用Step
,Step
会返回StepResult
,Workflow
然后调用StepResultConverter
(这是您可配置的映射内容),{{1 }}返回StepResultConverter
,StepInput
然后使用Workflow
调用下一个Step
,依此类推。
答案 2 :(得分:1)
我使用finite state machine实现工作流程取得了巨大成功。它可以是您想要的简单或复杂,多个工作流相互链接。通常,FSM可以实现为一个简单的表,其中通过在对象上保留转换的日志并简单地检索最后一个条目来跟踪给定对象的当前状态在历史表中。所以过渡的形式如下:
nextState = TransLookup(currState,Event,[Condition])
如果要实现前端,可以使用此转换信息构建当前状态下给定对象可用事件的列表。