工作流程與狀態機
工作流程
工作流程是應用程式中程序的模型。它可能是部落格文章從草稿到審閱和發布的過程。另一個範例是用戶提交一系列不同表單以完成任務。此類程序最好與您的模型分開,並應在組態中定義。
工作流程的定義包含從一個位置到另一個位置的地點和動作。這些動作稱為轉換。工作流程還需要知道每個物件在工作流程中的位置。標記儲存將目前的地點寫入物件的屬性。
注意
上面的術語通常在討論工作流程和Petri 網時使用
範例
最簡單的工作流程如下所示。它包含兩個地點和一個轉換。

當工作流程描述真實的商業案例時,可能會更複雜。下面的工作流程描述了填寫職位申請的流程。

在此範例中,當您填寫職位申請時,根據您申請的職位,有 4 到 7 個步驟。某些職位需要使用者回答人格測驗、邏輯測驗和/或正式要求。有些職位則不需要。GuardEvent
用於決定特定申請允許的後續步驟。
透過像這樣定義工作流程,可以概觀流程的外觀。流程邏輯不會與控制器、模型或視圖混合。步驟的順序可以僅透過變更組態來變更。
狀態機
狀態機是工作流程的子集,其目的是保存模型的狀態。它們之間最重要的差異是
- 工作流程可以同時處於多個地點,而狀態機則不能;
- 為了套用轉換,工作流程要求物件處於轉換的所有先前地點,而狀態機僅要求物件至少處於其中一個地點。
範例
提取請求從初始「開始」狀態開始,然後是「測試」狀態,例如在持續整合堆疊上執行測試。完成後,提取請求處於「審閱」狀態,貢獻者可以在其中要求變更、拒絕或接受提取請求。在任何時候,您也可以「更新」提取請求,這將導致另一次持續整合執行。

以下是提取請求狀態機的組態。
1 2 3 4 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
# config/packages/workflow.yaml
framework:
workflows:
pull_request:
type: 'state_machine'
marking_store:
type: 'method'
property: 'currentPlace'
# The "supports" option is useful only if you are using Twig functions ('workflow_*')
supports:
- App\Entity\PullRequest
initial_marking: start
places:
- start
- coding
- test
- review
- merged
- closed
transitions:
submit:
from: start
to: test
update:
from: [coding, test, review]
to: test
wait_for_review:
from: test
to: review
request_change:
from: review
to: coding
accept:
from: review
to: merged
reject:
from: review
to: closed
reopen:
from: closed
to: review
提示
如果您的轉換定義了工作流程中使用的所有地點,則可以省略 places
選項。Symfony 將自動從轉換中提取地點。
7.1
Symfony 7.1 中引入了對省略 places
選項的支援。
Symfony 會自動為您在組態中定義的每個工作流程 (Workflow) 或狀態機 (StateMachine) 建立服務。您可以透過使用服務自動裝配並使用 camelCased workflow name + Workflow
作為參數名稱,在類別內使用工作流程。如果是狀態機類型,請使用 camelCased workflow name + StateMachine
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
// ...
use App\Entity\PullRequest;
use Symfony\Component\Workflow\WorkflowInterface;
class SomeService
{
public function __construct(
// Symfony will inject the 'pull_request' state machine configured before
private WorkflowInterface $pullRequestStateMachine,
) {
}
public function someMethod(PullRequest $pullRequest): void
{
$this->pullRequestStateMachine->apply($pullRequest, 'wait_for_review', [
'log_comment' => 'My logging comment for the wait for review transition.',
]);
// ...
}
// ...
}
自動與手動驗證
在快取預熱期間,Symfony 會驗證在組態檔中定義的工作流程和狀態機。如果您的工作流程或狀態機是以程式方式而不是在組態檔中定義的,則可以使用 WorkflowValidator 和 StateMachineValidator 來驗證它們
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
// ...
use Symfony\Component\Workflow\Definition;
use Symfony\Component\Workflow\StateMachine;
use Symfony\Component\Workflow\Validator\StateMachineValidator;
$states = ['created', 'activated', 'deleted'];
$stateTransitions = [
new Transition('activate', 'created', 'activated'),
// This duplicate event "from" the "created" state is invalid
new Transition('activate', 'created', 'deleted'),
new Transition('delete', 'activated', 'deleted'),
];
// No validation is done upon initialization
$definition = new Definition($states, $stateTransitions);
$validator = new StateMachineValidator();
// Throws InvalidDefinitionException in case of an invalid definition
$validator->validate($definition, 'My First StateMachine');