Управлениесостояниемспомощью工作流
Управлениесостояниемспомощью工作流
Наличиекакого-либосостоянияумодели——довольнообычноеявление。Состояниекомментарияопределяеттолькоантиспам-сервис。Ночто,есливбудущемуваспоявятсябольшефакторовдляизменениясостояния吗?
Возможно,вызахотитедатьадминистраторусайтавозможностьмодерироватьвсекомментариипослетого,каконибудутпровереныантиспам-сервисом。Воткакбудетвыглядетьэтотпроцесс:
- Начинаемссостояния
提交
,когдапользовательотправляеткомментарий; - Делегируемантиспам-сервисупроанализироватькомментарийипереключимеговзависимостиотрезультатаводноизсостояний:
potential_spam
,火腿
или拒绝了
; - Есликомментарийнебылотклонён(тоестьоннеспам),ожидаем,покаадминистраторнерешит,достаточноликомментарийхорош,изменивегосостояниена
发表
или拒绝了
。
Реализацияданнойлогики——неслишкомсложнаязадача。Однакодобавлениедополнительныхправилзначительноусложнитэтузадачу。ВоспользуемсяSob娱乐下载ymfony-компонентом工作流,чтобынеписатьсамимлогикуснуля:
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 49 50 51 52 53 54 55 56 57 58 59 60
推荐- - - - - - MessageHandler / src / / CommentMessageHandler.php+ + + MessageHandler b / src / / CommentMessageHandler.php19 + 6 @@ 6日,28日@@使用App \ \ CommentMessage消息;使用App \ Repository \ CommentRepository;使用App \ SpamChecker;使用原则\ ORM \ EntityManagerInterface;+使用Psr \ Log \ LoggerInterface;使用Syob娱乐下载mfony \信使\ \组件处理程序\ MessageHandlerInterface;+使用Syob娱乐下载mfony \组件\ \ MessageBusInterface使者;+使用Syob娱乐下载mfony \工作流组件\ \ WorkflowInterface;类CommentMessageHandler实现MessageHandlerInterface{私人spamChecker美元;私人entityManager美元;私人commentRepository美元;美元+私人公交;+私人美元工作流;+私人美元记录器;公共函数__construct (EntityManagerInterface entityManager美元,SpamChecker SpamChecker美元,CommentRepository CommentRepository美元)+公共职能__construct (EntityManagerInterface entityManager美元,SpamChecker SpamChecker美元,CommentRepository CommentRepository美元,美元MessageBusInterface巴士,WorkflowInterface commentStateMachine美元,美元LoggerInterface记录器= null){$ this - > entityManager = $ entityManager;$ this - > spamChecker = $ spamChecker;$ this - > commentRepository = $ commentRepository;+ $ this - >总线= $总线;= $ + $ this - >工作流commentStateMachine;+ $ this - >日志记录器= $记录器;}公共职能__invoke (CommentMessage消息)美元@@ -28年12 + 37岁21 @@类CommentMessageHandler实现MessageHandlerInterface返回;}——如果(2 = = = $ this - > spamChecker - > getSpamScore(评论,美元消息- > getContext ())) {- $评论- >设置状态(“垃圾邮件”);-其他}{- $评论- >设置状态(“发表”);- - - - - -}- $ this - > entityManager - >冲洗();+如果($ this - >工作流- >(评论美元,“接受”)){+ $得分= $ this - > spamChecker - > getSpamScore(评论,美元消息- > getContext ());+ $过渡=“接受”;如果得分(2 = = = $ +){+ $过渡=“reject_spam”;+}elseif(1美元= = =分数){+ $过渡=“might_be_spam”;+}+ $ this - >工作流- >应用(评论,美元过渡);+ $ this - > entityManager - >冲洗();++ $ this - >总线- >调度($消息);+}elseif ($ this - >日志记录器){+ $ this - >日志- >调试(“删除评论消息”,(“评论”= > $评论- > getId(),“国家”= > $评论- > getState ()));+}}}
Новаялогикавыглядитследующимобразом:
- Есликомментарийможетперейтивсостояние
接受
,значитпроверяемсообщениенаспам; - Взависимостиотрезультатапроверки,нужновыбратьподходящийпереход;
- Вызываемметод
应用()
,чтобыобновитьсостояниедляобъекта评论,которыйвсвоюочередьвызываетвэтомобъектеметод设置状态()
; - Сохраняемданныевбазеданных,используяметод
冲洗()
; - Повторноотправляемсообщениенашину,чтобыещёраззапуститьбизнес-процесскомментариядляопределенияследующегоперехода。
Таккакещёнереализованавозможностьпроверкисообщенияадминистратором,приследующийобработкесообщениявлогзапишетсяследующее:“删除评论消息”。
Передтемкакначатьследующуюглаву,давайтедобавимавтоматическуюпроверку:
1 2 3 4 5 6 7 8 9 10 11 12
推荐- - - - - - MessageHandler / src / / CommentMessageHandler.php+ + + MessageHandler b / src / / CommentMessageHandler.php@@ -50 50 6 + 9 @@类CommentMessageHandler实现MessageHandlerInterface $ this - > entityManager - >冲洗();$ this - >总线- >调度($消息);+}elseif ($ this - >工作流- >(评论,美元“发布”)| | $ this - >工作流- >(评论美元,publish_ham)) {+ $ this - >工作流- >应用(评论,美元$ this - >工作流- >(评论美元,“出版”)?“发布”:“publish_ham”);+ $ this - > entityManager - >冲洗();}elseif ($ this - >日志记录器){$ this - >日志- >调试(“删除评论消息”,(“评论”= > $评论- > getId(),“国家”= > $评论- > getState ()));}
Выполнитекомандуob娱乐下载symfony服务器:日志
идобавьтекомментарийклюбойконференции,чтобыувидетьвтерминале,какодинзадругимпроисходятпереходысостояний。
Поисксервисовизконтейнеравнедрениязависимостей
Прииспользованиивнедрениязависимостеймыполучаемсервисыизконтейнера,указываяимяинтерфейсаиликонкретнуюреализациюкласса。Принесколькихреализацияходногоитогожеинтерфейса,Symfonyнob娱乐下载есможетпонять,какаяизнихвамнужна。Вэтомслучаенужноболееточноуказать,чтоименновыхотитеполучить。
ВпредыдущемразделепривнедренииWorkflowInterface
мыкакразстолкнулисьстакойпроблемой。
КакSob娱乐下载ymfonyопределяет,какуюреализациюобщегоинтерфейсаWorkflowInterface
нужноиспользоватьприеговнедрениичерезконструктор吗?Напомощьприходитимяаргумента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美元
。
请注意
Можновоспользоватьсякомандой调试:自动装配
изпредыдущейглавы:
1
美元ob娱乐下载symfony控制台调试:自动装配工作流程
Двигаемсядальше
- Бизнес-процессыиконечныеавтоматыичтовыбратьизних;
- ДокументацияпоSyob娱乐下载mfony工作流。