工作流程組件
工作流程組件提供了用於管理工作流程或有限狀態機的工具。
安裝
1
$ composer require symfony/workflow
注意
如果您在 Symfony 應用程式之外安裝此組件,您必須在程式碼中引入 vendor/autoload.php
檔案,以啟用 Composer 提供的類別自動載入機制。請閱讀這篇文章以了解更多詳細資訊。
建立工作流程
工作流程組件為您提供了一種物件導向的方式來定義物件經歷的流程或生命週期。流程中的每個步驟或階段都稱為「地點」。您也可以定義「轉換」,描述從一個地點到另一個地點的動作。

一組地點和轉換建立了一個「定義」。一個工作流程需要一個 Definition
和一種將狀態寫入物件的方法(即 MarkingStoreInterface 的實例)。
考慮以下部落格文章的範例。一篇文章可以有多種預定義的狀態(draft
、reviewed
、rejected
、published
)。在工作流程中,這些狀態稱為「地點」。您可以這樣定義工作流程
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
use Symfony\Component\Workflow\DefinitionBuilder;
use Symfony\Component\Workflow\MarkingStore\MethodMarkingStore;
use Symfony\Component\Workflow\Transition;
use Symfony\Component\Workflow\Workflow;
$definitionBuilder = new DefinitionBuilder();
$definition = $definitionBuilder->addPlaces(['draft', 'reviewed', 'rejected', 'published'])
// Transitions are defined with a unique name, an origin place and a destination place
->addTransition(new Transition('to_review', 'draft', 'reviewed'))
->addTransition(new Transition('publish', 'reviewed', 'published'))
->addTransition(new Transition('reject', 'reviewed', 'rejected'))
->build()
;
$singleState = true; // true if the subject can be in only one state at a given time
$property = 'currentState'; // subject property name where the state is stored
$marking = new MethodMarkingStore($singleState, $property);
$workflow = new Workflow($definition, $marking);
現在,「Workflow
」可以幫助您根據部落格文章所處的「地點」(狀態)來決定允許哪些「轉換」(動作)。這將使您的領域邏輯保持在一個地方,而不會分散在整個應用程式中。
使用方法
以下是使用上述定義的工作流程範例
1 2 3 4 5 6 7 8 9 10 11
// ...
// Consider that $blogPost is in place "draft" by default
$blogPost = new BlogPost();
$workflow->can($blogPost, 'publish'); // False
$workflow->can($blogPost, 'to_review'); // True
$workflow->apply($blogPost, 'to_review'); // $blogPost is now in place "reviewed"
$workflow->can($blogPost, 'publish'); // True
$workflow->getEnabledTransitions($blogPost); // $blogPost can perform transition "publish" or "reject"
初始化
如果物件的 marking 屬性為 null
,並且您想使用組態中的 initial_marking
進行設定,您可以呼叫 getMarking()
方法來初始化物件屬性
1 2 3 4 5
// ...
$blogPost = new BlogPost();
// initiate workflow
$workflow->getMarking($blogPost);
本作品,包括程式碼範例,依 Creative Commons BY-SA 3.0 授權條款授權。