Prendre des décisions avec un工作流
Prendre des décisions avec un工作流
Avoir un état pour un modèle est assez commun。L'état du commentaire n'est déterminé que par le vérificateur de spam。Et sion ajoutait d'autres critères de décision ?
网站自由管理知识modérer评论après vérificateur垃圾邮件。Le processus serait quelque chose comme:
- état
提交
Lorsqu 'UN commentaire est soumis of UN internaute; - 自由放任勒vérificateur垃圾分析勒评论和改变l'état en
potential_spam
,火腿
欧拒绝了
- S'il n'est pas rejeté, attendez que l'admin du site décide si le commentaire est suffisamment utitile en changeant l'état pour
发表
欧拒绝了
.
巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎巴黎。Au lieu de coder la loggique nous-mêmes, nous pouvons utiliser le composantob娱乐下载 Symfony工作流程:
1
$ob娱乐下载Symfony作曲家要求工作流
Décrire des工作流
Le workflow de commentaires peut être décrit dans Le fichier配置/包/ workflow.yaml
:
倒valider le工作流,générez une représentation visuelle:
1
$ob娱乐下载symfony控制台工作流:dump comment | dot - tng -o workflow.png
请注意
拉对点
功利事实Graphviz.
使用un工作流
在工作流程中传达的信息:
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;使用Syob娱乐下载mfony \信使\ \组件属性\ AsMessageHandler;+使用Syob娱乐下载mfony \组件\ \ MessageBusInterface使者;+使用Syob娱乐下载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 - >冲洗();}}
新逻辑就在眼前:
- 硅拉转变
接受
Est disponible pour le commentaire dans le message, vérifiez si c'est UN spam; - Selon le résultat, choisissez la bonne过渡à贴花;
- Appellez
应用()
pour mettre à jour le评论通过un appel à la méthode设置状态()
; - Appelez
冲洗()
Pour valider les changements dans la base de données; - Réexpédiez le message pour permettre au workflow d' efftuer une nouvelle transition。
Comme nous n'avons pas implémenté la fonctionnalité de validation par l'admin, la prochaine fois que le message sera consommé, le message“drop comment message”sera enregistré。
Mettons就地une验证自动辅助le prochain chapitre:
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()]);}
Executezob娱乐下载symfony服务器:日志
Et ajoutez UN commentaire sur le site pour voir toutes les transitions se produire les unes après les aures。
法国注射服务代理代理人dépendances
提供服务的知识dépendances,提供服务的知识récupérons提供服务的知识dépendances提供类型接口的知识implémentation提供类concrète。Mais quand une interface à plusieurs implémentations, ob娱乐下载Symfony ne peut deviner celle don ' t vous avez besoin。Nous avons besoin d'être显性。
我的思想是不能改变的WorkflowInterface
丹斯拉节précédente。
Comme nous injection n'import quelle instance de l'interface génériqueWorkflowInterface
dans le constructeur, comment ob娱乐下载Symfony peut savoir quelle implémentation du workflow utiliser ?ob娱乐下载Symfony utilization une convention basée根据le nom de l'argument:commentStateMachine美元
Fait référence au工作流评论
De la配置(不要le type eststate_machine
).随笔不输入论点和注入échouera。
我不懂规矩,我不懂命令调试:容器
.Cherchez tous les服务内容“工作流”:
12 3 4 5 6 7 8 9 10 11 12 13 14
$ob娱乐下载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] Symob娱乐下载fony\Component\Workflow\WorkflowInterface$commentStateMachine[9] Psr \ \ LoggerInterface日志$workflowLogger>
对选择的评论8
,ob娱乐下载Symfony \工作流组件\ \ WorkflowInterface commentStateMachine美元
Qui vous indique qu'utilisercommentStateMachine美元
Comme argument nommé une signification particulière。
请注意
Nous aurions pu utiliser la command调试:自动装配
Comme vu dans UN précédent chapitre:
1
$ob娱乐下载Symfony控制台调试:自动装配工作流