Symfony 工作流程 - 是否可以使用学说关系作为状态持有者?

Symfony Workflow - Is it possible to use doctrine relation as state holder?

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

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

但是,如果我有一个实体 BlogPost,其关系 BlogPostStatus 有两个字段:一些主要的 idstatusName。我可以配置工作流组件来更改我的 BlogPost 的状态(即将新的 BlogPostStatus 设置为 BlogPost 实体)并将其保存到数据库吗?

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

你有更好的解决方案吗?

对于所有内置 marking_store 实现,以下为真:

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

有 3 个内置标记存储,SingleStateMarkingStore (using the property accessor, hence setMarking/getMarking), the MultiStateMarkingStore (same), the MethodMarkingStore(显式调用这些函数,您可以通过 marking_store 配置的 property 设置更改函数)。

区别在于 setMarking 调用中提供的参数,对于单一状态(这是 state_machine 类型,默认情况下不是 workflow 类型),参数是放置标记的 place (或状态)。对于多状态(默认workflow类型),参数是一个数组,其中键是位置,值是标记,通常标记是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 应该是 不同的 一个(例如,常量对象),那么您必须使用 new interface that dbrumann linked,并挂钩事件以将其添加到上下文中。

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

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