Symfony 工作流程 - 是否可以使用学说关系作为状态持有者?
Symfony Workflow - Is it possible to use doctrine relation as state holder?
我正在尝试将 Symfony 工作流组件应用到我的应用程序中。
正如文档所说 marking_store
指向字符串。我在谷歌上搜索它——它可以是 Doctrine 实体的 string
或 json_array
字段。
但是,如果我有一个实体 BlogPost
,其关系 BlogPostStatus
有两个字段:一些主要的 id
和 statusName
。我可以配置工作流组件来更改我的 BlogPost
的状态(即将新的 BlogPostStatus
设置为 BlogPost
实体)并将其保存到数据库吗?
现在我只有一个解决方案:添加到我的 BlogPost
实体非映射字段,并在它更改时更改实体的状态。
你有更好的解决方案吗?
对于所有内置 marking_store 实现,以下为真:
如果持有状态的对象上存在函数setMarking
或getMarking
,它们将分别用于设置或获取标记。
有 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)
此外,如果您不使用单状态工作流而是使用多状态工作流,则必须找到一种方法将(地点->标记)数组转换为您的状态对象,反之亦然。
我正在尝试将 Symfony 工作流组件应用到我的应用程序中。
正如文档所说 marking_store
指向字符串。我在谷歌上搜索它——它可以是 Doctrine 实体的 string
或 json_array
字段。
但是,如果我有一个实体 BlogPost
,其关系 BlogPostStatus
有两个字段:一些主要的 id
和 statusName
。我可以配置工作流组件来更改我的 BlogPost
的状态(即将新的 BlogPostStatus
设置为 BlogPost
实体)并将其保存到数据库吗?
现在我只有一个解决方案:添加到我的 BlogPost
实体非映射字段,并在它更改时更改实体的状态。
你有更好的解决方案吗?
对于所有内置 marking_store 实现,以下为真:
如果持有状态的对象上存在函数setMarking
或getMarking
,它们将分别用于设置或获取标记。
有 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)
此外,如果您不使用单状态工作流而是使用多状态工作流,则必须找到一种方法将(地点->标记)数组转换为您的状态对象,反之亦然。