一个工作流的做出决定
一个工作流的做出决定
有状态的模型是很常见的。评论的状态只由垃圾邮件检查程序。如果我们添加更多的决定因素?
我们可能想要让网站管理垃圾邮件检查程序后温和的所有评论。这个过程将会的东西:
- 开始于一个
提交
国家由用户提交评论时; - 让垃圾邮件检查程序分析评论和开关状态
potential_spam
,火腿
,或拒绝了
; - 如果没有拒绝,等待网站管理员决定评论是否足够好通过切换状态
发表
或拒绝了
。
实现这个逻辑不太复杂,但你可以想象,增加更多的规则将大大增加复杂性。而不是编码的逻辑,我们可以使用Symfony的工作流组件:ob娱乐下载
1
美元ob娱乐下载symfony作曲家申请工作流
描述工作流
评论可以描述的工作流配置/包/ workflow.yaml
文件:
验证工作流,生成可视化表示:
1
美元ob娱乐下载symfony控制台工作流:转储|点-Tpng - o workflow.png置评
请注意
的点
命令的一部分Graphviz实用程序。
使用一个工作流
替换当前消息处理程序与工作流逻辑:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
推荐- - - - - - MessageHandler / src / / CommentMessageHandler.php+ + + MessageHandler b / src / / CommentMessageHandler.php@@ 6、7 + 6、10 @@使用App \ \ CommentMessage消息;使用App \ Repository \ CommentRepository;使用App \ SpamChecker;使用原则\ ORM \ EntityManagerInterface;+使用Psr \ Log \ LoggerInterface;使用Syob娱乐下载mfony \信使\ \组件属性\ AsMessageHandler;+使用Syob娱乐下载mfony \组件\ \ MessageBusInterface使者;+使用Syob娱乐下载mfony \工作流组件\ \ WorkflowInterface;-15 # (AsMessageHandler)类CommentMessageHandler @@ 6 + 18日9 @@类CommentMessageHandler私有EntityManagerInterface entityManager美元,私人SpamChecker SpamChecker美元,私人CommentRepository CommentRepository美元,美元+私人MessageBusInterface巴士,+私人WorkflowInterface commentStateMachine美元,+私人? LoggerInterface记录器美元=零,){}@@ -25,12 + 31日18 @@类CommentMessageHandler返回;}——如果(2 = = = $ this - > spamChecker - > getSpamScore(评论,美元消息- > getContext ())) {- $评论- >设置状态(“垃圾邮件”);-其他}{- $评论- >设置状态(“发表”);+如果($ this - > commentStateMachine - >(评论美元,“接受”)){+ $得分= $ this - > spamChecker - > getSpamScore(评论,美元消息- > getContext ());+ $过渡=匹配(分美元){+ 2 = > ' reject_spam ',+ 1 = > ' might_be_spam ',+默认= >“接受”,+};+ $ this - > commentStateMachine - >应用(评论,美元过渡);+ $ this - > entityManager - >冲洗();+ $ this - >总线- >调度($消息);+}elseif ($ this - >日志记录器){+ $ this - >日志- >调试(“删除评论消息”,(“评论”= > $评论- > getId(),“国家”= > $评论- > getState ()));}- - - - - -- $ this - > entityManager - >冲洗();}}
新的逻辑读取如下:
- 如果
接受
过渡是可用的评论信息,检查垃圾邮件; - 根据不同的结果,选择合适的过渡到应用;
- 调用
应用()
通过调用更新评论设置状态()
方法; - 调用
冲洗()
提交更改数据库; - 重新分派消息再次允许工作流过渡。
我们还没有实现管理员验证,下次信息消费,“删除评论信息”将被记录。
让我们实现一个auto-validation直到下一章:
1 2 3 4 5 6 7 8 9 10 11 12
推荐- - - - - - MessageHandler / src / / CommentMessageHandler.php+ + + MessageHandler b / src / / CommentMessageHandler.php@@ -41 6 + 41 9 @@类CommentMessageHandler $ this - > commentStateMachine - >应用(评论,美元过渡);$ this - > entityManager - >冲洗();$ this - >总线- >调度($消息);+}elseif ($ this - > commentStateMachine - >(评论,美元“发布”)| | $ this - > commentStateMachine - >(评论美元,publish_ham)) {+ $ this - > commentStateMachine - >应用(评论,美元$ this - > commentStateMachine - >(评论美元,“出版”)?“发布”:“publish_ham”);+ $ this - > entityManager - >冲洗();}elseif ($ this - >日志记录器){$ this - >日志- >调试(“删除评论消息”,(“评论”= > $评论- > getId(),“国家”= > $评论- > getState ()));}
运行ob娱乐下载symfony服务器:日志
并添加一个注释在前端所有转换一个接一个的发生。
找到服务的依赖注入容器
使用依赖注入时,我们得到了从依赖注入容器的服务类型提示一个接口或有时一个具体的实现类名称。但是当一个接口有几个实现,Symfony不能猜你需要哪一个。ob娱乐下载我们需要一个明确的方法。
我们刚刚遇到这样一个例子的注入WorkflowInterface
在前一节中。
当我们注入任何通用的实例WorkflowInterface
在构造函数接口,如何Symfony想使用哪一个工作流实现?ob娱乐下载ob娱乐下载Symfony使用公约基于参数的名称:commentStateMachine美元
指的是评论
工作流配置(类型state_machine
)。尝试其他参数名称和它将会失败。
如果你不记得约定,使用调试:容器
命令。搜索所有包含“工作流”服务:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
美元ob娱乐下载symfony控制台调试:工作流容器选择以下服务来显示其信息之一:[0]console.command.workflow_dump[1]工作流。摘要[2]workflow.marking_store。方法[3]工作流。注册表[4]workflow.security。expression_language[5]工作流。twig_extension [6] monolog.logger。工作流[7]Symfonyob娱乐下载 \工作流组件\ \注册[8]Symfony \组件\ \ WorkflowInterface工作流美元commentStateMachine[9]Psr \ \ LoggerInterface日志美元workflowLogger>
注意选择8
,ob娱乐下载Symfony \工作流组件\ \ WorkflowInterface commentStateMachine美元
告诉你,使用哪一个commentStateMachine美元
作为参数的名字有特殊的含义。
请注意
我们可以使用了调试:自动装配
在前一章命令:
1
美元ob娱乐下载symfony控制台调试:自动装配工作流程
要进一步
- 工作流程和状态机当选择每一个;
- 的ob娱乐下载Symfony工作流程文档。