首页 > 解决方案 > Symfony Workflow - 是否可以使用学说关系作为状态持有者?

问题描述

我正在尝试在我的应用程序中采用 Symfony 工作流组件。

正如文档所说,marking_store指向字符串。我在谷歌上搜索它 - 它可以是一个stringjson_array- 一个 Doctrine 实体的字段。

但是,如果我有一个具有两个字段BlogPost的关系的实体怎么办BlogPostStatus:一些主要id的和statusName. 我可以配置工作流组件以更改我的状态BlogPost(即设置新实体)并将其保存到数据库吗BlogPostStatusBlogPost

现在我只有一个解决方案:添加到我的BlogPost实体非映射字段以及当它更改实体的更改状态时。

你有更好的解决方案吗?

标签: symfonysymfony4symfony-workflows

解决方案


对于所有内置的 marking_store 实现,以下是正确的:

如果函数setMarkinggetMarking存在于持有状态的对象上,它们将分别用于设置或获取标记。

有 3 个内置标记存储,SingleStateMarkingStore(使用属性访问器,因此 setMarking/getMarking)、MultiStateMarkingStore(相同)、MethodMarkingStore(显式调用这些函数,您可以通过配置property设置更改函数marking_store)。

区别在于调用中提供的参数setMarking,对于单个状态(这是state_machine类型,默认情况下不是workflow类型),参数是放置标记的位置(或状态)。对于多状态(workflow默认为 type ),参数是一个数组,其中键是位置,值是标记,通常标记是1,并且省略空的位置。

因此,我假设您的BlogPost(当前)在任何给定时间只有一个状态,而您现在要做的是将给定的标记转换为状态实体 - 我将假设您的工作流程具有类型state_machine

/** in class BlogPost */
public function setMarking(string $marking/*, array $context*/) {
    $this->status->statusName = $marking;
}

public function getMarking() {
    return $this->status->statusName;
}

特别案例

如果BlogPostStatus应该是不同的(例如,一个常量对象),那么您必须使用dbrumann 链接的新接口,并挂钩到事件以将其添加到上下文中。

如果在 setMarking/getMarking 时 BlogPostStatus 可能不存在,您必须在 setter 中动态创建它并在 getter 中检查它。但我相信你有能力做到这一点;o)

此外,如果您不使用单状态工作流程而是使用多状态,则必须找到一种方法将 (places->marks) 数组转换为您的状态对象,反之亦然。


推荐阅读