symfony - 如何在状态机的工作流组件中触发 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
- 在这种情况下如何触发该初始事件?
initial_marking
如果我必须在创建时保持实体有效,那么选项的目的是什么?
补充说明
关键workflow.entered.draft
是没有触发事件,因为$training
在创建期间设置了状态。这就是工作流组件忽略触发事件的原因,因为主题已经在工作流中。
为了解决这种情况,我不应该设置状态(离开它null
)并允许工作流设置初始地名。但我不想这样做,因为我不想让我的实体无效。
另一种解决方案是例如创建“假”初始状态init
并添加从init
to 的转换draft
。这种情况很好,但是initial_marking
选择没有意义。
解决方案
推荐阅读
- javascript - 基础 javascript 没有按预期工作
- shell - 如何在床文件中对具有相同名称的序列进行编号
- c++ - 将大小为编译时常量的数组初始化为单个值
- c++ - 在 C++ 中使用向量传递任意数量的参数
- python - 我使用 np.array() 创建 N*M 数组的一些奇怪现象
- python - python中的麦克风功能不会停止监听
- javascript - Angular 8 - 延迟加载模块:错误 TS1323:仅当“--module”标志为“commonjs”或“esNext”时才支持动态导入
- javascript - 正确格式化/解析不同的日期格式
- php - 删除自定义 postype 基础 slug 并使用自定义分类 + 帖子标题或只是帖子标题为永久链接添加前缀
- php - 在不使用 javascript 和 jquery 的情况下,在 php 中使用分页的多个复选框