ワ,クフロ,を使って判定する
ワ,クフロ,を使って判定する
モデルが状態を持ことはよくあります。今はコメントの状態はスパムチェッカ,からしか変わりませんが,他の状態の追加を検討してみましょう。
スパムチェックの後に,Webサ。このプロセスは次の行のようなものです:
- ユ,ザ,がコメントを追加した際の
提交
状態から始めましょう; - スパムチェッカ,にコメントを分析させ,
potential_spam
,火腿
(スパムでないメ,ル),拒绝了
のいずれかの状態にス电子邮箱ッチさせるようにしましょう; - リジェクトされなければ,Webサ
发表
もしくは拒绝了
の状態に変更するのを待ましょう。
ロジックを実装するのはそれほど複雑ではありませんが,さらにルールを追加することで複雑になることもあります。ロジックを自分でコーディングするのではなく,ob娱乐下载Symfonyワークフローコンポーネントを使用してみます:
1
$ob娱乐下载Symfony作曲家要求工作流
ワ,クフロ,を記述する
コメントワ,クフロ,は,配置/包/ workflow.yaml
ファ电子邮箱ルに記述されます:
ワ,クフロ,をバリデ,トするために,視覚的な表現を生成します:
1
$ob娱乐下载symfony控制台工作流:dump comment | dot - tng -o workflow.png
请注意
点
コマンドは,Graphvizユ,ティリティの一部です。
ワ,クフロ,を使用する
現在のメッセ,ジハンドラ,のロジックをワ,クフロ,に置き換えます:
12 34 56 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 49 50 51 52 53 54 55 56 57 58 59 60
——MessageHandler / src / / CommentMessageHandler.php+ + + MessageHandler b / src / / CommentMessageHandler.php@@ -6,19 +6,28 @@使用App\Message\CommentMessage;使用App \ Repository \ CommentRepository;使用App \ SpamChecker;使用原则\ ORM \ EntityManagerInterface;+使用Psr \ Log \ LoggerInterface;使用Syob娱乐下载mfony \信使\ \组件处理程序\ MessageHandlerInterface;+使用Syob娱乐下载mfony \组件\ \ MessageBusInterface使者;+使用Syob娱乐下载mfony \工作流组件\ \ WorkflowInterface;类CommentMessageHandler实现MessageHandlerInterface {private $spamChecker;私人entityManager美元;私人commentRepository美元;+私人$bus;+私人$工作流;+ private $logger;-公共函数__construct(EntityManagerInterface $entityManager, SpamChecker $ SpamChecker, CommentRepository $ CommentRepository)+公共函数__construct(EntityManagerInterface $entityManager, SpamChecker $ SpamChecker, CommentRepository $ CommentRepository, MessageBusInterface $bus, WorkflowInterface $commentStateMachine, LoggerInterface $logger = null){$this->entityManager = $entityManager;$this->spamChecker = $spamChecker;$this->commentRepository = $commentRepository;+ $this->总线= $总线;+ $this->工作流= $commentStateMachine;+ $this->记录器= $记录器;}公共函数__invoke(CommentMessage $message) @@ -28,12 +37,21类CommentMessageHandler实现MessageHandlerInterface返回;}- if (2 === $this->spamChecker->getSpamScore($comment, $message->getContext())) {——评论- >设置状态(“垃圾邮件”);-}其他{——评论- >设置状态(“发表”);- - - - - -}- $ this - > entityManager - >冲洗();+ if ($this->工作流->can($comment, 'accept')) {+ $score = $this->spamChecker->getSpamScore($comment, $message->getContext());+ $transition = 'accept';+ if (2 === $score) {+ $transition = 'reject_spam';+} elseif (1 === $score) {+ $transition = 'might_be_spam';+}+ $this->工作流->应用($注释,$过渡);+ $ this - > entityManager - >冲洗();++ $ this - >总线- >调度($消息);+} elseif ($this->记录器){+ $this->logger->debug('删除评论消息',['comment' => $comment->getId(), 'state' => $comment->getState()]);+}}}
新しいロジックは以下のようになります:
- メッセ,ジ内のコメントにおいて,
接受
遷移が可能であれば,スパムチェックを行います; - 結果に応じた正しい状態遷移を選んでください;
设置状态()
メソッドを介して,コメントを更新するための应用()
を呼んでください;冲洗()
を呼び,デ,タベ,スに変更をコミットしてください;- ワ,クフロ,の再遷移を許容させるため,メッセ,ジを再ディスパッチしてください。
管理者のバリデーションはまだ実装していないので,メッセージの取得実行をすると”コメントメッセージを削除します”とログが吐かれます。
次の章までに自動バリデ,ションを実装しましょう:
12 3 4 5 6 7 8 9 10 11 12
——MessageHandler / src / / CommentMessageHandler.php+ + + MessageHandler b / src / / CommentMessageHandler.php@@ -50,6 +50,9 @@类CommentMessageHandler实现MessageHandlerInterface $this->entityManager->flush();$ this - >总线- >调度($消息);+} elseif ($this->workflow->can($comment, 'publish') || $this->workflow->can($comment, 'publish_ham')) {+ $this->工作流->应用($comment, $this->工作流->可以($comment, '发布')?'publish': 'publish_ham');+ $ this - > entityManager - >冲洗();} elseif ($this->logger) {$this->logger->debug('删除评论消息',['comment' => $comment->getId(), 'state' => $comment->getState()]);}
ob娱乐下载symfony服务器:日志
を実行し,フロントエンドでコメントが追加し,順々に状態が遷移することを確認してください。
diコンテナからサ,ビスを検索する
DIを使う際,インターフェースや場合によっては具体的な実装クラスの名前をタイプヒンティングとしてDIコンテナからサービスを取得しますが,インターフェースが複数の実装クラスを持っている場合,ob娱乐下载Symfonyはどのクラスが必要か推測することができません。その場合は明示する方法が必要です。
このような例は,前章でWorkflowInterface
を注入した時に出くわしたばかりです。
一般的なWorkflowInterface
インターフェースをコンストラクタで注入すると,ob娱乐下载Symfonyはどのようにしてどちらのワークフローの実装を使うかを推測するでしょうか吗?ob娱乐下载Symfonyは引数名を基にした規約を利用します:commentStateMachine美元
は评论
ワ、クフロ、(state_machine
型)の設定を参照します。
もし規約が思い出せない場合は,调试:容器
コマンドを使いましょう。工作流
を含む全てのサ,ビスを検索します:
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美元
は,commentStateMachine美元
を引数名として使うことに特別な意味があることを伝えています。
请注意
前章で見たように调试:自动装配
を使うことができます:
1
$ob娱乐下载Symfony控制台调试:自动装配工作流