在Symfony 3.3中, Workflow组件 将涵盖很多有用的新功能。
添加了一个全新的 workflow_has_marked_place() Twig函数
这个Twig helper函数用于检查给定对象的标志是否拥有给定的状态:
添加了一个全新的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(',') }} |