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