symfony - Symfony Workflow - 是否可以使用学说关系作为状态持有者?
问题描述
我正在尝试在我的应用程序中采用 Symfony 工作流组件。
正如文档所说,marking_store
指向字符串。我在谷歌上搜索它 - 它可以是一个string
或json_array
- 一个 Doctrine 实体的字段。
但是,如果我有一个具有两个字段BlogPost
的关系的实体怎么办BlogPostStatus
:一些主要id
的和statusName
. 我可以配置工作流组件以更改我的状态BlogPost
(即设置新实体)并将其保存到数据库吗BlogPostStatus
?BlogPost
现在我只有一个解决方案:添加到我的BlogPost
实体非映射字段以及当它更改实体的更改状态时。
你有更好的解决方案吗?
解决方案
对于所有内置的 marking_store 实现,以下是正确的:
如果函数setMarking
或getMarking
存在于持有状态的对象上,它们将分别用于设置或获取标记。
有 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) 数组转换为您的状态对象,反之亦然。
推荐阅读
- ruby-on-rails - 获取无法刷新 google_oauth2 身份验证令牌错误。
- javascript - 如何修复 JSX 道具不应该使用 .bind() 错误
- java - java中数字阶乘的动态方法,给出NULLPOINTEREXCEPTIN
- android - Firebase 数据库内容删除
- angular - 使用Angular6中的变量为打印任务动态生成HTML
- google-cloud-platform - ctpu命令搭建TPU测试环境报错
- java - 如何使用 Android Studio 在 Firebase 中检查“用户电子邮件已存在”
- algorithm - 向数组添加或减去随机数以使数字的差值不超过 8 的算法
- c# - 如何在 ASP.NET Core 2.0 的自定义验证属性中进行客户端验证?
- python-3.x - Python - 使用 PIL 库使文本倾斜