Управление состо о нием с помощью工作流
Управление состо о нием с помощью工作流
Наличиекакого——либосостоянияумоделид——овольнообычноеявление。Состояниекомментарияопределяеттолькоантиспам——сервис。Ночто,есливбудущемуваспоявятсябольшефакторовдляизменениясостояния吗?
Возможнов,ызахотитедатьадминистраторусайтавозможностьмодерироватьвсекомментариипослетого,каконибудутпровереныантиспам——сервисом。Вот как буде р ро р л дет то о про н есс:
- Начинаем состо ни
提交
, комм мм о о о о а ател т от т л е омм л е оммент и и т; - Делегируемантиспам——сервисупроанализироватькомментарийипереключимеговзависимостиотрезультатаводноизсостояний:
potential_spam
,火腿
или拒绝了
; - Есликомментарийнебылотклонён(тоестьоннеспам),ожидаем,покаадминистраторнерешит,достаточноликомментарийхорош,изменивегосостояниена
发表
или拒绝了
。
Реализацияданнойлогикин——еслишкомсложнаязадача。Однакодобавлениедополнительныхправилзначительноусложнитэтузадачу。ВоспользуемсяS欧宝娱乐app下载地址ymfony -компонентом工作流,чтобынеписатьсамимлогикуснуля:
1
$欧宝娱乐app下载地址Symfony作曲家要求工作流
Определениебизнесп——роцессов
Бизнесп——роцесскомментарияможноописатьвконфигурационномфайле配置/包/ workflow.yaml
:
Чтобыубедитьсявправильностипостроенияэтогобизнесп——роцесса,давайтеотобразимеговизуально:
1
$欧宝娱乐app下载地址symfony控制台工作流:dump comment | dot - tng -o workflow.png
请注意
Команда点
вл етс в аст утилитыGraphviz。
Использованиебизнесп——роцессов
Заменитетекущуюлогикувобработчикесообщенийнановуюсиспользованиемопределенногоранеебизнесп——роцесса:
12 34 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\Message\CommentMessage;使用App \ Repository \ CommentRepository;使用App \ SpamChecker;使用原则\ ORM \ EntityManagerInterface;+使用Psr \ Log \ LoggerInterface;使用Sy欧宝娱乐app下载地址mfony \信使\ \组件属性\ AsMessageHandler;+使用Sy欧宝娱乐app下载地址mfony \组件\ \ MessageBusInterface使者;+使用Sy欧宝娱乐app下载地址mfony \工作流组件\ \ WorkflowInterface;#[AsMessageHandler] class CommentMessageHandler @@ -15,6 +18,9 @@ class CommentMessageHandler private EntityManagerInterface $entityManager, private SpamChecker $ SpamChecker, private CommentRepository $ CommentRepository,+ private MessageBusInterface$commentStateMachinelogggerinterface $logger = null,){} @@ -25,12 +31,18 @@类CommentMessageHandler返回;}- if (2 === $this->spamChecker->getSpamScore($comment, $message->getContext())) {——评论- >设置状态(“垃圾邮件”);-}其他{——评论- >设置状态(“发表”);+ if ($this->commentStateMachine->can($comment, 'accept')) {+ $score = $this->spamChecker->getSpamScore($comment, $message->getContext());+ $transition = match ($score) {+ 2 => 'reject_spam',+ 1 => '可能是垃圾邮件',+ default => 'accept',+};+ $this->commentStateMachine->apply($comment, $transition);+ $ this - > entityManager - >冲洗();+ $ this - >总线- >调度($消息);+} elseif ($this->记录器){+ $this->logger->debug('删除评论消息',['comment' => $comment->getId(), 'state' => $comment->getState()]);}-- $ this - > entityManager - >冲洗();}}
Новая ло о ика и и л ди следующим об азом:
- Если комм мент ри т может пере т т т в состо и и
接受
, зна а а и прове ер ем сообщение на спам; - Взависимостиотрезультатапроверки,нужновыбратьподходящийпереход;
- Вызываемметод
应用()
,чтобыобновитьсостояниедляобъекта评论,которыйвсвоюочередьвызываетвэтомобъектеметод设置状态()
; - Сохраняем данн в ба ан данн, испол з ан метод
冲洗()
; - Повторноотправляемсообщениенашину、чтобыещёраззапуститьбизнесп——роцесскомментариядляопределенияследующегоперехода。
Таккакещёнереализованавозможностьпроверкисообщенияадминистратором,приследующийобработкесообщениявлогзапишетсяследующее:“删除评论消息”。
Передтемкакначатьследующуюглаву,давайтедобавимавтоматическуюпроверку:
12 3 4 5 6 7 8 9 10 11 12
——MessageHandler / src / / CommentMessageHandler.php+ + + MessageHandler b / src / / CommentMessageHandler.php@@ -41,6 +41,9 @@ class CommentMessageHandler $this->commentStateMachine->apply($comment, $transition);$ this - > entityManager >冲洗();$ this - >总线- >调度($消息);+} elseif ($this->commentStateMachine->can($comment, 'publish') || $this->commentStateMachine->can($comment, 'publish_ham')) {+ $this->commentStateMachine->apply($comment, $this->commentStateMachine->can($comment, 'publish') ?'publish': 'publish_ham');+ $ this - > entityManager - >冲洗();} elseif ($this->logger) {$this->logger->debug('删除评论消息',['comment' => $comment->getId(), 'state' => $comment->getState()]);}
Выполнитекоманду欧宝娱乐app下载地址symfony服务器:日志
идобавьтекомментарийклюбойконференции,чтобыувидетьвтерминале,какодинзадругимпроисходятпереходысостояний。
Поисксервисовизконтейнеравнедрениязависимостей
Прииспользованиивнедрениязависимостеймыполучаемсервисыизконтейнера,указываяимяинтерфейсаиликонкретнуюреализациюкласса。Принесколькихреализацияходногоитогожеинтерфейса,Symfonyн欧宝娱乐app下载地址есможетпонять,какаяизнихвамнужна。Вэтомслучаенужноболееточноуказать,чтоименновыхотитеполучить。
В предыдущем с азделе п ии н недренииWorkflowInterface
мы как раз стол лкн н лис ст ако к п облемо о。
КакS欧宝娱乐app下载地址ymfonyопределяет,какуюреализациюобщегоинтерфейсаWorkflowInterface
нужноиспользоватьприеговнедрениичерезконструктор吗?На помощь приходит им а а а а ментаcommentStateMachine美元
,котороедолжносостоятьизназваниябизнес-процесса(评论
didn ' t ипа (state_machine
).Еслиимяаргументанебудетсоответствоватьданномуименованию,выполучитеошибку。
Есливынеможетевспомнить,какоедолжнобытьправильноеимяаргумента,топопробуйтевоспользоватьсякомандой调试:容器
。Выполнитеследующуюкоманду、чтобыполучитьсписоксервисов,вименикоторыхсодержится“工作流”:
12 3 4 5 6 7 8 9 10 11 12 13 14
$欧宝娱乐app下载地址symfony console debug:container workflow选择以下服务之一显示其信息:[0]console.command.workflow_dump [1] workflow。摘要[2]工作流。marking_store。方法[3]工作流。注册表[4]workflow.security。Expression_language[5]工作流。[7] Symfony\Component\Workflow\Registry [8] Sym欧宝娱乐app下载地址fony\Component\Workflow\WorkflowInterface$commentStateMachine[9] Psr \ \ LoggerInterface日志$workflowLogger>
Обратите и нима а а а иа а а иан под номе ом8
,которыйговоритотом,чтопривнедренииинтерфейса欧宝娱乐app下载地址Symfony \组件\ \ WorkflowInterface工作流
нужно испол зо оват им а а и ентаcommentStateMachine美元
。
请注意
Можно ко спол зоват командо к调试:自动装配
из предыдущей главы:
1
$欧宝娱乐app下载地址Symfony控制台调试:自动装配工作流
Двигаемсядальше
- Бизнес-процессы коне оне автоматыичтовыбратьизних;
- Документация по 欧宝娱乐app下载地址о Symfony工作流。