尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

Symfony Workflow API 参考:WorkflowInterface 全部方法清单与示例指南

Symfony Workflow API 参考:WorkflowInterface 全部方法清单与示例指南 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),仅供参考
返回列表