Mit einem Workflow Entscheidungen treffen
Mit einem Workflow Entscheidungen treffen
艾宁州(Zustand) für ein Modell zu haben, ist durchaus üblich。Der Kommentar-Zustand wid nur vom垃圾邮件检查器bestimmt。是passiert, wenn wir weitere Entscheidungsfaktoren hinzufügen?
Vielleicht möchten wir alle Kommentare nach dem垃圾邮件检查durch网站管理员*innen moderieren lassen。Der Prozess würde etwa so aussehen:
- 从einem开始
提交
-Zustand, wenn ein Kommentar von einemr Benutzer在荒野中; - Lasse den Kommentar vom垃圾邮件检查分析程序和setze den Zustand纠缠程序
potential_spam
汪汪汪,火腿
, oder auf拒绝了
; - Wenn der Zustand nicht
拒绝了
Ist, warte bis eine网站管理员在entscheidet, ob der Kommentar gut genug ist and den Zustand auf发表
奥得河拒绝了
andert。
Die Implementierung diesel Logik ist niht allzu schwierig, aber Du kannst Dir beestimmt vorstellen, dass das Hinzufügen weiterer Regeln Die Komplexität deutlich steigern würde。können wir die Symfony Workflow Komponente verwenden:ob娱乐下载
1
$ob娱乐下载Symfony作曲家要求工作流
工作流definieren
Der Kommentar-Workflow kann in Der Datei配置/包/ workflow.yaml
definiert了:
Erzeuge eine Visualisierung, um den工作流zu überprüfen:
1
$ob娱乐下载symfony控制台工作流:dump comment | dot - tng -o workflow.png
请注意
Der点
-Befehl ist Teil desGraphviz-Dienstprogramms。
艾宁工作流verwenden
Ersetze die aktuelle Logik im消息处理程序durch den工作流:
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 - >冲洗();}}
“新生的洛神”
- Überprüfe die Nachricht auf Spam, wenn der
接受
-Übergang für den Kommentar in der Nachricht verfügbar ist。 - Abhängig vom Ergebnis wendest Du den entsprechenden Übergang an;
- Fuhre
应用()
aus, um den Kommentar durch einen Aufruf der设置状态()
-Methode zu aktualisieren; - Rufe
冲洗()
auf,嗯die Änderungen in der Datenbank zu speichern; - Versende die Nachricht erneut, damit der nächste Übergang im Workflow stattfinden kann。
Da wir die Admin-Validierung nicht implementiert haben, wid beim nächsten Verarbeiten der Nachricht " drop comment message" geloggt。
实施者与bis zum nächsten自动验证器!
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()]);}
Fuhreob娱乐下载symfony服务器:日志
ausund füge einen Kommentar im Frontend hinzu,嗯alle Übergänge nacheinander zu sehen。
服务(Dienste) vom依赖注入容器找到
依赖注入组件,依赖注入组件,依赖注入容器类型提示接口。Aber wenn das Interface mehere Ausführungen hat, kann Sob娱乐下载ymfony nicht mehr erraten, welches Du meinst。müssen einen Weg finden,嗯das genau anzugeben。
Gerade solch eine direkte Angabe für die Dependency Injection hatten wir im vorherigen Abschnitt mit der Injection einesWorkflowInterface
.
Wenn wir irgendeine Instanz des generischen ' WorkflowInterface-Interface im construction angeben, wie kanob娱乐下载n Symfony dann raten welche工作流- anwendung genutzt werden soll?ob娱乐下载Symfony nutzt eine Konvention basierend auf dem论证- namen:
commentStateMachine美元再见,再见
评论-配置中的工作流(dessen Typ .
state_machine“坚持)。这是一场疯狂的争论。
东方之夜,疯狂之夜调试:容器
-Befehl。Suche nach allen Services (Diensten) die“workflow”beinhalten:
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>
Siehst Du die选项8
?ob娱乐下载Symfony \工作流组件\ \ WorkflowInterface commentStateMachine美元
sagt Dir, dass die Nutzung voncommentStateMachine美元
als论点eine besondere Bedeutung hat。
请注意
Wir hätten auch den调试:自动装配
-Befehl nutzen können, wie wir im vorherigen Kapitel gesehen haben:
1
$ob娱乐下载Symfony控制台调试:自动装配工作流
Weiterfuhrendes
- 工作流和ZustandsmaschinenUnd wann man是wählen sollte;
- 死ob娱乐下载Symfony工作流文档.