在Symfony 3.3中, Workflow组件 将涵盖很多有用的新功能。

添加了一个全新的 workflow_has_marked_place() Twig函数

这个Twig helper函数用于检查给定对象的标志是否拥有给定的状态:

1
2
3
{% if workflow_has_marked_place(subject, 'ordered') %}
    ...
{% endif %}

添加了一个全新的SupportStrategyInterface

Workflow组件的 Registry 类对一个subject的类实例进行检查以决定是否对它进行支持。然而,某些项目使用一个通用的类来持有任意的内容类型(content type)之内容。此时,通过检查该类的content type,能够使用registry来对该内容确认其为受支持的工作流就非常有用了。

在Symfony 3.3中,我们做出了一些改变来令以上成为可能。首先,我们不再传入类名作为 WorkflowRegistry::add() 方法的第二个参数。然后,我们添加了一个 SupportStrategyInterface 以及一个 ClassInstanceSupportStrategy 来对类的名称打包。最后,我们添加了一个相关的 support_strategy 配置选项 (这是 supports 选项的手动专用选项)。

添加了一个全新的entered事件

对此事件的必要性进行了长时间讨论之后,决定在Symfony 3.3中添加一个全新的 entered 事件,仅在一个transition(过渡)之后进行触发。既存的 enter 事件并不够用,因为它是在新的标志(markings)被设置之前进行调用是,因此你不能,比如,在监听里面(inside a listener)刷新(flush)一个entity。

为所有事件添加了工作流名称

Event 类现在包括了一个 getWorkflowName() 方法,以获取工作流的名称。

为DefinitionBuilder添加了一个流化接口

Fluent interfaces 在软件工程学中存有争议,但对于 object builders 而言它们是有意义的,因为它们可以简化代码。在Symfony 3.3中, DefinitionBuilder 为自身全部方法提供了一个fluent interface:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// Before / 之前
use Symfony\Component\Workflow\DefinitionBuilder;
use Symfony\Component\Workflow\Transition;
 
$builder = new DefinitionBuilder();
$builder->addPlaces(['draft', 'review', 'rejected', 'published']);
 
$builder->addTransition(new Transition('to_review', 'draft', 'review'));
$builder->addTransition(new Transition('publish', 'review', 'published'));
$builder->addTransition(new Transition('reject', 'review', 'rejected'));
 
$definition = $builder->build();
 
// After / 之后
use Symfony\Component\Workflow\DefinitionBuilder;
use Symfony\Component\Workflow\Transition;
 
$definition = (new DefinitionBuilder())
    ->addPlaces(['draft', 'review', 'rejected', 'published'])
    ->addTransition(new Transition('to_review', 'draft', 'review'))
    ->addTransition(new Transition('publish', 'review', 'published'))
    ->addTransition(new Transition('reject', 'review', 'rejected'))
    ->build()
;

添加了一个全新的 workflow_marked_place() Twig函数

当使用一个自定义的 MarkingStore 时,$subject::marking 中的值相对于 Marking::getPlaces() 中的值来说,可以多种多样。这发生在,比如,存储在subject中的值是一个位掩码(bitmask)时。

因此,从marking中获取位置名称(places names)总是更加安全的,标志物正是此新功能之目的:

1
{{ workflow_marked_places(post)|join(',') }}