ワ,クフロ,を使って判定する

ワ,クフロ,を使って判定する

モデルが状態を持ことはよくあります。今はコメントの状態はスパムチェッカ,からしか変わりませんが,他の状態の追加を検討してみましょう。

スパムチェックの後に,Webサ。このプロセスは次の行のようなものです:

  • ユ,ザ,がコメントを追加した際の提交状態から始めましょう;
  • スパムチェッカ,にコメントを分析させ,potential_spam火腿(スパムでないメ,ル),拒绝了のいずれかの状態にス电子邮箱ッチさせるようにしましょう;
  • リジェクトされなければ,Webサ发表もしくは拒绝了の状態に変更するのを待ましょう。

ロジックを実装するのはそれほど複雑ではありませんが,さらにルールを追加することで複雑になることもあります。ロジックを自分でコーディングするのではなく,ob娱乐下载Symfonyワークフローコンポーネントを使用してみます:

1
ob娱乐下载Symfony作曲家要求工作流

ワ,クフロ,を記述する

コメントワ,クフロ,は,配置/包/ 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:来自:火腿:拒绝了

ワ,クフロ,をバリデ,トするために,視覚的な表現を生成します:

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

8ob娱乐下载Symfony \工作流组件\ \ WorkflowInterface commentStateMachine美元は,commentStateMachine美元を引数名として使うことに特別な意味があることを伝えています。

请注意

前章で見たように调试:自动装配を使うことができます:

1
ob娱乐下载Symfony控制台调试:自动装配工作流
此工作,包括代码示例,是根据知识共享协议BY-NC-SA 4.0许可证。