跳到主要內容

工作流程與狀態機

編輯此頁

工作流程

工作流程是應用程式中程序的模型。它可能是部落格文章從草稿到審閱和發布的過程。另一個範例是用戶提交一系列不同表單以完成任務。此類程序最好與您的模型分開,並應在組態中定義。

工作流程的定義包含從一個位置到另一個位置的地點和動作。這些動作稱為轉換。工作流程還需要知道每個物件在工作流程中的位置。標記儲存將目前的地點寫入物件的屬性。

注意

上面的術語通常在討論工作流程和Petri 網時使用

範例

最簡單的工作流程如下所示。它包含兩個地點和一個轉換。

A simple state diagram showing a single transition between two places.

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

A complex state diagram showing many places with multiple possible transitions between them.

在此範例中,當您填寫職位申請時,根據您申請的職位,有 4 到 7 個步驟。某些職位需要使用者回答人格測驗、邏輯測驗和/或正式要求。有些職位則不需要。GuardEvent 用於決定特定申請允許的後續步驟。

透過像這樣定義工作流程,可以概觀流程的外觀。流程邏輯不會與控制器、模型或視圖混合。步驟的順序可以僅透過變更組態來變更。

狀態機

狀態機是工作流程的子集,其目的是保存模型的狀態。它們之間最重要的差異是

  • 工作流程可以同時處於多個地點,而狀態機則不能;
  • 為了套用轉換,工作流程要求物件處於轉換的所有先前地點,而狀態機僅要求物件至少處於其中一個地點。

範例

提取請求從初始「開始」狀態開始,然後是「測試」狀態,例如在持續整合堆疊上執行測試。完成後,提取請求處於「審閱」狀態,貢獻者可以在其中要求變更、拒絕或接受提取請求。在任何時候,您也可以「更新」提取請求,這將導致另一次持續整合執行。

A state diagram for the pull request process described previously.

以下是提取請求狀態機的組態。

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 會驗證在組態檔中定義的工作流程和狀態機。如果您的工作流程或狀態機是以程式方式而不是在組態檔中定義的,則可以使用 WorkflowValidatorStateMachineValidator 來驗證它們

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');
本作品,包括程式碼範例,均根據 Creative Commons BY-SA 3.0 授權條款授權。
目錄
    版本