首页 > 解决方案 > 如何在状态机的工作流组件中触发 initial_place_name 事件

问题描述

我创建了一个具有非空status属性的实体。工作流组件配置为将该属性用于marking store. 该initial_marking选项设置为draft

实体始终具有某种状态,因此该属性不能为空。这就是为什么当我想创建新实体时,我必须提供它的初始状态——在这种情况下draft

根据文档

如果您通过调用 $workflow->getMarking($object); 来初始化标记,那么将使用默认上下文 (Workflow::DEFAULT_INITIAL_CONTEXT) 调用 workflow.[workflow_name].entered.[initial_place_name] 事件。

但是,不会触发该事件,因为实体状态属性已draft在创建期间设置为。

class Training
{
    public function __construct(
        private string $title,
        private string $status,
    ) {}
}
$training = new Training('title', 'draft');
$trainingStatusStateMachine->getMarking($training); // <- here `workflow.entered.draft` event should be triggered
  1. 在这种情况下如何触发该初始事件?
  2. initial_marking如果我必须在创建时保持实体有效,那么选项的目的是什么?

补充说明

关键workflow.entered.draft是没有触发事件,因为$training在创建期间设置了状态。这就是工作流组件忽略触发事件的原因,因为主题已经在工作流中。

为了解决这种情况,我不应该设置状态(离开它null)并允许工作流设置初始地名。但我不想这样做,因为我不想让我的实体无效。

另一种解决方案是例如创建“假”初始状态init并添加从initto 的转换draft。这种情况很好,但是initial_marking选择没有意义。

标签: symfonysymfony-workflows

解决方案


推荐阅读