
Symfony Workflow API 參考WorkflowInterface 全部方法清單與示例指南【免費下載鏈接】workflowProvides tools for managing a workflow or finite state machine項目地址: https://gitcode.com/gh_mirrors/workflo/workflow Symfony Workflow 組件是什么Symfony Workflow位于workflo/workflow是 Symfony 全家桶中的工作流組件提供了一套管理**工作流Workflow或有窮狀態機Finite State Machine**的工具。你可以用它來管理訂單審批、文章發布、任務流轉等典型的狀態推進場景定義狀態places、狀態之間的遷移transitions然后對業務對象安全地執行狀態變更。本指南帶你完整梳理 WorkflowInterface.php 中定義的9 個方法——這是與 Workflow 交互的核心 API讀懂它就等于讀懂了整個組件的使用方式。? 先搭一個最小可用的工作流在逐方法講解前先用幾行代碼搭一個博客文章工作流后文所有示例都基于它。你可以用 DefinitionBuilder.php 來聲明狀態與遷移use Symfony\Component\Workflow\DefinitionBuilder; use Symfony\Component\Workflow\MarkingStore\MethodMarkingStore; use Symfony\Component\Workflow\Transition; use Symfony\Component\Workflow\Workflow; $builder (new DefinitionBuilder()) -addPlaces([draft, under_review, published, rejected]) -setInitialPlaces(draft) -addTransition(new Transition(publish, under_review, published)) -addTransition(new Transition(reject, under_review, rejected)) -addTransition(new Transition(revise, under_review, draft)) -addTransition(new Transition(submit, draft, under_review)); $workflow new Workflow($builder-build(), new MethodMarkingStore(), null, post);其中 Transition.php 描述一次遷移名字 從哪些狀態出發froms 到達哪些狀態tos。StateMachine.php 則提供了一次只能處于一個狀態的狀態機變體后面會單獨說明。 WorkflowInterface 全部 9 個方法速查表#方法作用一句話返回值1getMarking($subject)獲取對象當前所處狀態標記Marking2can($subject, $transitionName)判斷某個遷移現在能否執行bool3buildTransitionBlockerList($subject, $transitionName)查明遷移被阻塞的原因TransitionBlockerList4apply($subject, $transitionName, $context [])觸發遷移真正把狀態推進Marking5getEnabledTransitions($subject)列出對象當前所有可執行的遷移Transition[]6getEnabledTransition($subject, $name)按名稱取回某個已啟用的遷移?Transition7getName()獲取工作流名稱string8getDefinition()獲取狀態與遷移的完整定義Definition9getMarkingStore()獲取狀態的存儲策略MarkingStoreInterface 補充說明接口中getMetadataStore()用于獲取元數據存儲見 MetadataStoreInterface.php通常配合Definition一起使用方便查詢狀態上的標簽、說明等附加信息。 核心方法逐個詳解1.getMarking()—— 讀取對象當前狀態getMarking()返回一個 Marking 對象它記錄了令牌token在哪些狀態上。首次調用時若對象還沒有標記Workflow 會自動把令牌放到初始狀態上$marking $workflow-getMarking($post); $marking-getPlaces(); // 例如 [draft 1] $marking-has(draft); // true在 Workflow工作流網模型中一個對象可以同時處于多個狀態因此返回的是狀態名 令牌數的數組這正是它與狀態機的關鍵區別。若標記中的狀態名在定義里不存在會拋出LogicException定義見 LogicException.php。2.can()—— 執行前先試探一下if ($workflow-can($post, publish)) { // 遷移可用可以放心 apply }can()會綜合檢查兩件事當前標記是否滿足遷移的出發狀態要求以及守衛Guard監聽器是否放行守衛機制見 GuardListener.php。它只判斷、不執行是寫前端按鈕是否可點擊時的最佳幫手。3.buildTransitionBlockerList()—— 遷移為什么被擋住了can()只告訴你能不能buildTransitionBlockerList()則回答為什么不能。它返回一個 TransitionBlockerList里面記錄了每一類阻塞原因$blockers $workflow-buildTransitionBlockerList($post, publish); foreach ($blockers as $blocker) { // $blocker-getReason() 例如 blocked_by_marking、blocked_by_guard }常見原因有兩類BLOCKED_BY_MARKING對象不在遷移要求的出發狀態上BLOCKED_BY_GUARD守衛監聽器顯式攔截比如缺少某個字段。若遷移名稱根本沒定義會拋出 UndefinedTransitionException。4.apply()—— 觸發遷移真正推進狀態這是整個組件里最重要的方法。調用它會按固定順序執行并派發事件離開舊狀態leave→ 遷移中transition→ 進入新狀態enter→ 全部完成entered / completed→ 廣播可用遷移announce最終返回新的Markingtry { $workflow-apply($post, publish, [editor admin]); } catch (NotEnabledTransitionException $e) { // 遷移當前不可用 } catch (UndefinedTransitionException $e) { // 遷移不存在 }對應異常類NotEnabledTransitionException.php、UndefinedTransitionException.php。第三個參數$context是上下文數組會隨事件傳遞給各監聽器例如把是誰執行的操作帶進去做審計記錄審計示例見 AuditTrailListener.php。5.getEnabledTransitions()/ 6.getEnabledTransition()—— 拿到可操作菜單getEnabledTransitions($post)返回當前所有可執行的Transition[]非常適合渲染后臺操作按鈕列表getEnabledTransition($post, publish)按名稱取回單個遷移若不可用則返回null。兩者都基于標記滿足 守衛放行的規則計算與can()的判定邏輯一致區別只在于返回的是完整的遷移對象你能進一步調用getName()、getFroms()、getTos()。7~9. 名稱、定義與存儲getName()、getDefinition()、getMarkingStore()getName()返回構建時指定的名稱如post。當同一對象被多個工作流管理時比如內容流安全審核流靠名稱區分這也是 Registry.php 按名查找工作流的依據getDefinition()返回 Definition.php 對象包含全部狀態、遷移、初始狀態和元數據調試時打印它最能定位配置問題getMarkingStore()返回 MarkingStoreInterface.php 的實現決定標記存在哪里。內置的 MethodMarkingStore.php 通過對象的getMarking()/setMarking()方法存取在 Symfony 框架中還可以換成屬性標記存儲直接落在實體的某個字段上測試示例見 PropertiesMarkingStoreTest.php。?? Workflow 與 StateMachine 有什么區別兩者共用同一套接口差異只在語義上對比項WorkflowStateMachine同時狀態數多個工作流網嚴格一個apply前檢查不強制唯一狀態強制當前只有 1 個狀態否則報錯典型場景復雜流程編排多人協作節點簡單對象生命周期實現位置Workflow.phpStateMachine.phpStateMachine.php 繼承自Workflow只是構造時默認使用單狀態模式的MethodMarkingStore。如果你的業務是訂單待付款 → 已付款 → 已發貨 → 已完成這種線性流轉用StateMachine更直觀。? 附贈與 9 個方法配套的 7 種事件apply()之所以強大是因為它會派發一系列事件全部常量定義在 WorkflowEvents.php事件常量事件名派發時機GUARDworkflow.guard判斷遷移是否放行時LEAVEworkflow.leave離開舊狀態后TRANSITIONworkflow.transition遷移進行中ENTERworkflow.enter進入新狀態后ENTEREDworkflow.entered遷移收尾后COMPLETEDworkflow.completed遷移完成時ANNOUNCEworkflow.announce廣播后續可用遷移在 Workflow.php 中可以看到每個事件還會派生形如workflow.post.enter.published的精細命名方便你只監聽某工作流 某狀態的變化。事件類源碼集中在 Event/ 目錄例如 EnterEvent.php、GuardEvent.php。? 把工作流畫出來workflow:dump 命令配置好后可運行workflow:dump命令導出圖形描述支持PlantUML、Mermaid、DOT三種格式命令源碼見 WorkflowDumpCommand.php渲染器分別位于 PlantUmlDumper.php、MermaidDumper.php、GraphvizDumper.phpbin/console workflow:dump post --dump-formatmermaid bin/console workflow:dump post --dump-formatpuml配合--with-metadata可把元數據畫進圖里--with-listeners可把監聽器標注在對應狀態節點上。輸出的參考樣例可查看 Tests/Fixtures/puml/ 下的.puml文件直觀感受狀態圖最終長什么樣。 核心源碼文件導航模塊文件說明核心接口WorkflowInterface.php本文主角9 個方法定義處默認實現Workflow.phpapply、事件派發邏輯狀態機StateMachine.php單狀態約束變體狀態定義Definition.php、DefinitionBuilder.php狀態與遷移的聲明遷移對象Transition.php、Arc.phpfrom/to 弧與權重標記存儲MarkingStore/標記的讀寫策略守衛機制EventListener/GuardListener.php表達式守衛圖形導出Dumper/puml / mermaid / dot單元測試Tests/WorkflowTest.php最完整的 API 使用示例 總結查狀態用getMarking()試狀態用can()問原因用buildTransitionBlockerList()推狀態用apply()getEnabledTransitions()是渲染操作入口的首選方法簡單生命周期選StateMachine復雜協作流程選Workflow想深入源碼從 Tests/WorkflowTest.php 讀起它幾乎覆蓋了WorkflowInterface的每一種用法與邊界情況。【免費下載鏈接】workflowProvides tools for managing a workflow or finite state machine項目地址: https://gitcode.com/gh_mirrors/workflo/workflow創作聲明:本文部分內容由AI輔助生成(AIGC),僅供參考