如何使用Workflow组件进行并行批准?

时间:2016-07-06 12:41:26

标签: workflow symfony

我一直试图了解Symfony中新的Workflow组件并查看Github上的示例。在此示例中,有一个记者批准和拼写检查批准,这两个都需要移动到已发布的位置。如何处理记者或拼写检查员的拒绝?例如,如果有一个journalist_reject转换和一个spellcheker_reject转换,那么系统怎么能以只有一次拒绝的拒绝状态结束呢?

1 个答案:

答案 0 :(得分:1)

symfony工作流组件并没有真正以这种方式工作,而不会将其与某些自定义逻辑交织在一起。纯粹使用工作流程组件构建将需要以任意顺序进行两次转换,以便从状态A(例如,草稿)转换到状态B(已批准)。当然,您可以通过实施两个中间状态来获得两个批准:

  • 草稿 - >由spellchecker批准 - >完全批准
  • 草稿 - >由记者批准 - >完全批准

在完全批准之前的任何州,可以过渡到被拒绝。然而,随着每次中间转换,这种系统的复杂性将呈指数增长。三个批准者系统已经需要更多:

  • 草稿 - >经A批准 - > A和B批准 - >批准
  • 草稿 - >经A批准 - >由A和C批准 - >批准
  • 草稿 - > B批准 - > A和B批准 - >批准
  • 草稿 - > B批准 - >由B和C批准 - >批准
  • 草稿 - > C批准 - >由A和C批准 - >批准
  • 草稿 - > C批准 - >由B和C批准 - >批准

所以现在我们已经从2种可能的流量转移到6种可能的流量。增加第四个批准者会使可能的流量增加更多,而且还需要对现有流量进行重大修改。

在我看来,更好的方法是只从草案过渡到批准,从草案过渡到拒绝,但只有 允许从草案过渡到批准所有必需批准者批准了该文章,例如,通过使批准操作成为命令而不是立即触发转换,并在所有批准者已经给予批准的情况下触发命令处理程序中的转换(例如,可以轻松地对现有验证组件执行)。转换为拒绝将不会被验证,并将立即执行,因为任何拒绝都足以拒绝一篇文章。或者可能不是 - 在此设置中添加要求也很容易。

这样,您可以根据需要添加任意数量的并行批准,而不会增加应用程序的复杂性,更重要的是,您可以添加批准者而无需修改工作流程。