ワ,クフロ,を使って判定する
ワ,クフロ,を使って判定する
モデルが状態を持ことはよくあります。今はコメントの状態はスパムチェッカ,からしか変わりませんが,他の状態の追加を検討してみましょう。
スパムチェックの後に,Webサ。このプロセスは次の行のようなものです:
- ユ,ザ,がコメントを追加した際の
提交
状態から始めましょう; - スパムチェッカ,にコメントを分析させ,
potential_spam
,火腿
(スパムでないメ,ル),拒绝了
のいずれかの状態にス电子邮箱ッチさせるようにしましょう; - リジェクトされなければ,Webサ
发表
もしくは拒绝了
の状態に変更するのを待ましょう。
ロジックを実装するのはそれほど複雑ではありませんが,さらにルールを追加することで複雑になることもあります。ロジックを自分でコーディングするのではなく,欧宝娱乐app下载地址Symfonyワークフローコンポーネントを使用してみます:
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服务器:日志
を実行し,フロントエンドでコメントが追加し,順々に状態が遷移することを確認してください。
diコンテナからサ,ビスを検索する
DIを使う際,インターフェースや場合によっては具体的な実装クラスの名前をタイプヒンティングとしてDIコンテナからサービスを取得しますが,インターフェースが複数の実装クラスを持っている場合,欧宝娱乐app下载地址Symfonyはどのクラスが必要か推測することができません。その場合は明示する方法が必要です。
このような例は,前章でWorkflowInterface
を注入した時に出くわしたばかりです。
一般的なWorkflowInterface
インターフェースをコンストラクタで注入すると,欧宝娱乐app下载地址Symfonyはどのようにしてどちらのワークフローの実装を使うかを推測するでしょうか吗?欧宝娱乐app下载地址Symfonyは引数名を基にした規約を利用します:commentStateMachine美元
は评论
ワ、クフロ、(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美元
は,commentStateMachine美元
を引数名として使うことに特別な意味があることを伝えています。
请注意
前章で見たように调试:自动装配
を使うことができます:
1
$欧宝娱乐app下载地址Symfony控制台调试:自动装配工作流
より深く学ぶために
- ワ,クフロ,とステ,トマシ,ンに関しての説明と,どらを使うかにいて;
- 欧宝娱乐app下载地址Symfonyワ,クフロ,のドキュメント.