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 enpotential_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

配置/包/ workflow.yaml
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
框架:工作流程:备注:类型:state_machineaudit_trail:启用:“% kernel.debug %”marking_store:类型:“方法”属性:“状态”支持:-应用实体\ \发表评论initial_marking:提交地方:-提交-火腿-potential_spam-垃圾邮件-拒绝了-发表转换:接受:来自:提交:火腿might_be_spam:来自:提交:potential_spamreject_spam:来自:提交:垃圾邮件发布:来自:potential_spam:发表拒绝:来自:potential_spam:拒绝了publish_ham:来自:火腿:发表reject_ham:来自:火腿:拒绝了

倒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ériqueWorkflowInterfacedans 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\WorkflowInterfacecommentStateMachine[9] Psr \ \ LoggerInterface日志workflowLogger>

对选择的评论8ob娱乐下载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控制台调试:自动装配工作流
此工作,包括代码示例,是根据知识共享协议BY-NC-SA 4.0许可证。