工作流组件
工作流组件提供了管理工作流或有限状态机的工具。
安装
1
$ composer require symfony/workflow
注意
如果您在 Symfony 应用程序之外安装此组件,则必须在您的代码中 require vendor/autoload.php
文件,以启用 Composer 提供的类自动加载机制。阅读这篇文章以了解更多详情。
创建工作流
工作流组件为您提供了一种面向对象的方式来定义您的对象经历的过程或生命周期。流程中的每个步骤或阶段都称为地点。您还需要定义转换,这些转换描述了从一个地点到另一个地点的操作。

一组地点和转换创建了一个定义。工作流需要一个 Definition
和一种将状态写入对象的方法(即 MarkingStoreInterface 的实例)。
考虑以下博客文章的示例。一篇文章可以有多个预定义的statuses(draft
, reviewed
, rejected
, published
)。在工作流中,这些statuses称为地点。您可以像这样定义工作流
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
use Symfony\Component\Workflow\DefinitionBuilder;
use Symfony\Component\Workflow\MarkingStore\MethodMarkingStore;
use Symfony\Component\Workflow\Transition;
use Symfony\Component\Workflow\Workflow;
$definitionBuilder = new DefinitionBuilder();
$definition = $definitionBuilder->addPlaces(['draft', 'reviewed', 'rejected', 'published'])
// Transitions are defined with a unique name, an origin place and a destination place
->addTransition(new Transition('to_review', 'draft', 'reviewed'))
->addTransition(new Transition('publish', 'reviewed', 'published'))
->addTransition(new Transition('reject', 'reviewed', 'rejected'))
->build()
;
$singleState = true; // true if the subject can be in only one state at a given time
$property = 'currentState'; // subject property name where the state is stored
$marking = new MethodMarkingStore($singleState, $property);
$workflow = new Workflow($definition, $marking);
Workflow
现在可以帮助您根据博客文章所处的地点(状态)来决定允许哪些转换(操作)。这将使您的领域逻辑保持在一个地方,而不是分散在整个应用程序中。
使用
以下是使用上面定义的工作流的示例
1 2 3 4 5 6 7 8 9 10 11
// ...
// Consider that $blogPost is in place "draft" by default
$blogPost = new BlogPost();
$workflow->can($blogPost, 'publish'); // False
$workflow->can($blogPost, 'to_review'); // True
$workflow->apply($blogPost, 'to_review'); // $blogPost is now in place "reviewed"
$workflow->can($blogPost, 'publish'); // True
$workflow->getEnabledTransitions($blogPost); // $blogPost can perform transition "publish" or "reject"
初始化
如果您的对象的 marking 属性是 null
并且您想使用配置中的 initial_marking
设置它,您可以调用 getMarking()
方法来初始化对象属性
1 2 3 4 5
// ...
$blogPost = new BlogPost();
// initiate workflow
$workflow->getMarking($blogPost);
这项工作,包括代码示例,根据 Creative Commons BY-SA 3.0 许可证获得许可。