如何创建和使用工作流
编辑该页面一个>警告:你浏览的文档欧宝体育电话<一个href="//www.oldmanjams.com/releases/4.1">欧宝娱乐app下载地址Symfony 4.1一个>,不再维护。
读<一个href="//www.oldmanjams.com/doc/current/workflow.html">这个页面的更新版本一个>Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。
< /div>如何创建和使用工作流一个>< /h1>
创建一个工作流一个>< /h2>
工作流是一个过程或对象经历一个生命周期。每一个步骤或阶段的过程被称为的地方。您还做定义转换描述行动从一个地方到另一个地方。
一组和转换创建了一个地方定义。一个工作流需要一个定义
和写美国的对象(即一个实例<一个href="https://github.com/symfony/symfony/blob/4.1/src/Symfony/Component/Workflow/MarkingStore/MarkingStoreInterface.php" class="reference external" title="MarkingStoreInterface" rel="external noopener noreferrer" target="_blank">MarkingStoreInterface一个>。)
考虑下面的例子可以有这些地方的博文:草案
,审查
,拒绝了
,发表
。您可以定义工作流是这样的:
- YAML跨度>< /li>
- XML跨度>< /li>
- PHP跨度>< /li>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29
#配置/包/ workflow.yaml跨度><跨度类="hljs-attr">框架:跨度><跨度类="hljs-attr">工作流程:跨度><跨度类="hljs-attr">blog_publishing:跨度><跨度类="hljs-attr">类型:跨度><跨度类="hljs-string">“工作流程”跨度><跨度类="hljs-comment">#或“state_machine”跨度><跨度类="hljs-attr">audit_trail:跨度><跨度类="hljs-attr">启用:跨度><跨度类="hljs-literal">真正的跨度><跨度类="hljs-attr">marking_store:跨度><跨度类="hljs-attr">类型:跨度><跨度类="hljs-string">“multiple_state”跨度><跨度类="hljs-comment">#或“single_state”跨度><跨度类="hljs-attr">参数:跨度><跨度类="hljs-bullet">- - - - - -跨度><跨度类="hljs-string">“currentPlace”跨度><跨度类="hljs-attr">支持:跨度><跨度类="hljs-bullet">- - - - - -跨度><跨度类="hljs-string">App \实体\博客跨度><跨度类="hljs-attr">initial_place:跨度><跨度类="hljs-string">草案跨度><跨度类="hljs-attr">地方:跨度><跨度类="hljs-bullet">- - - - - -跨度><跨度类="hljs-string">草案跨度><跨度类="hljs-bullet">- - - - - -跨度><跨度类="hljs-string">审查跨度><跨度类="hljs-bullet">- - - - - -跨度><跨度类="hljs-string">拒绝了跨度><跨度类="hljs-bullet">- - - - - -跨度><跨度类="hljs-string">发表跨度><跨度类="hljs-attr">转换:跨度><跨度类="hljs-attr">to_review:跨度><跨度类="hljs-attr">来自:跨度><跨度类="hljs-string">草案跨度><跨度类="hljs-attr">:跨度><跨度类="hljs-string">审查跨度><跨度类="hljs-attr">发布:跨度><跨度类="hljs-attr">来自:跨度><跨度类="hljs-string">审查跨度><跨度类="hljs-attr">:跨度><跨度类="hljs-string">发表跨度><跨度类="hljs-attr">拒绝:跨度><跨度类="hljs-attr">来自:跨度><跨度类="hljs-string">审查跨度><跨度类="hljs-attr">:跨度><跨度类="hljs-string">拒绝了跨度>< /code>
1 2 3 4 5 6 7
类跨度><跨度类="hljs-title">博客跨度>< /跨度>{<跨度类="hljs-comment">/ /使用这个属性标记跨度><跨度类="hljs-keyword">公共跨度><跨度类="hljs-variable">美元跨度>currentPlace跨度>;<跨度类="hljs-keyword">公共跨度><跨度类="hljs-variable">美元跨度>标题跨度>;<跨度类="hljs-keyword">公共跨度><跨度类="hljs-variable">美元跨度>内容跨度>;}
请注意跨度>< /p>标记存储类型可能是“multiple_state”或“single_state”。一个状态标志商店不支持模型在多个地方在同一时间。
< /div>
提示跨度>< /p>的类型
(默认值single_state
),参数
(默认值标记
)的属性marking_store
选项都是可选的。如果省略,将使用默认值。
< /div>
提示跨度>< /p>设置audit_trail.enabled
选项真正的
使应用程序生成工作流活动的详细日志消息。
< /div>
使用一个工作流一个>< /h2>
一旦blog_publishing
创建工作流,您现在可以使用它来决定什么行为是允许在一篇博客文章。例如,在一个控制器的一个应用程序使用<一个href="//www.oldmanjams.com/doc/4.1/service_container.html" class="reference internal">默认的服务。yaml的配置一个>,您可以通过将工作流工作流注册服务:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35
/ /……跨度><跨度类="hljs-keyword">使用跨度><跨度类="hljs-title">欧宝娱乐app下载地址\<跨度类="hljs-title">组件跨度>\<跨度类="hljs-title">工作流跨度>\<跨度类="hljs-title">注册表跨度>;<跨度类="hljs-keyword">使用跨度><跨度类="hljs-title">应用程序跨度>\<跨度类="hljs-title">实体跨度>\<跨度类="hljs-title">博客跨度>;<跨度类="hljs-keyword">使用跨度><跨度类="hljs-title">欧宝娱乐app下载地址\<跨度类="hljs-title">包跨度>\<跨度类="hljs-title">FrameworkBundle跨度>\<跨度类="hljs-title">控制器跨度>\<跨度类="hljs-title">AbstractController跨度>;<跨度类="hljs-keyword">使用跨度><跨度类="hljs-title">欧宝娱乐app下载地址\<跨度类="hljs-title">组件跨度>\<跨度类="hljs-title">工作流跨度>\<跨度类="hljs-title">异常跨度>\<跨度类="hljs-title">TransitionException跨度>;<跨度类="hljs-class">类跨度><跨度类="hljs-title">BlogController跨度><跨度类="hljs-keyword">扩展跨度><跨度类="hljs-title">AbstractController跨度>< /跨度>{<跨度类="hljs-keyword">公共跨度><跨度类="hljs-function">函数跨度><跨度类="hljs-title">编辑跨度><跨度类="hljs-params">(注册表<跨度类="hljs-variable">美元跨度>工作流跨度>)跨度>< /跨度>{<跨度类="hljs-variable">美元跨度>帖子跨度>=<跨度类="hljs-keyword">新跨度>博客();<跨度类="hljs-variable">美元跨度>工作流跨度>=<跨度类="hljs-variable">美元跨度>工作流跨度><跨度类="hljs-operator">- >跨度>get (<跨度类="hljs-variable">美元跨度>帖子跨度>);<跨度类="hljs-comment">/ /如果有多个工作流为同一类,跨度><跨度类="hljs-comment">/ /通过工作流名称作为第二个参数跨度><跨度类="hljs-comment">/ /工作流=工作流- >得到美元($邮报,“blog_publishing”);跨度><跨度类="hljs-comment">/ /你也可以与对象相关联的所有工作流程,这是有用的跨度><跨度类="hljs-comment">/ /例如展示在后台所有工作流的状态跨度><跨度类="hljs-variable">美元跨度>postWorkflows跨度>=<跨度类="hljs-variable">美元跨度>工作流跨度><跨度类="hljs-operator">- >跨度>(<跨度类="hljs-variable">美元跨度>帖子跨度>);<跨度类="hljs-variable">美元跨度>工作流跨度><跨度类="hljs-operator">- >跨度>可以(<跨度类="hljs-variable">美元跨度>帖子跨度>,<跨度类="hljs-string">“发布”跨度>);<跨度类="hljs-comment">/ /错误跨度><跨度类="hljs-variable">美元跨度>工作流跨度><跨度类="hljs-operator">- >跨度>可以(<跨度类="hljs-variable">美元跨度>帖子跨度>,<跨度类="hljs-string">“to_review”跨度>);<跨度类="hljs-comment">/ /正确的跨度><跨度类="hljs-comment">/ /更新的现状后跨度><跨度类="hljs-keyword">试一试跨度>{<跨度类="hljs-variable">美元跨度>工作流跨度><跨度类="hljs-operator">- >跨度>应用(<跨度类="hljs-variable">美元跨度>帖子跨度>,<跨度类="hljs-string">“to_review”跨度>);}<跨度类="hljs-keyword">抓跨度>(TransitionException<跨度类="hljs-variable">美元跨度>异常跨度>){<跨度类="hljs-comment">/ /……如果过渡是不允许的跨度>}<跨度类="hljs-comment">/ /查看所有可用的转换后的当前状态跨度><跨度类="hljs-variable">美元跨度>转换跨度>=<跨度类="hljs-variable">美元跨度>工作流跨度><跨度类="hljs-operator">- >跨度>getEnabledTransitions (<跨度类="hljs-variable">美元跨度>帖子跨度>);}}
4.1跨度>< /p>的<一个href="https://github.com/symfony/symfony/blob/4.1/src/Symfony/Component/Workflow/Exception/TransitionException.php" class="reference external" title="TransitionException" rel="external noopener noreferrer" target="_blank">TransitionException一个>类是在Symfony 4.1中引入的。欧宝娱乐app下载地址
< /div>
4.1跨度>< /p>的<一个href="https://github.com/symfony/symfony/blob/4.1/src/Symfony/Component/Workflow/Registry.php" class="reference external" title="所有()" rel="external noopener noreferrer" target="_blank">所有()一个>方法是在Symfony 4.1中引入的。欧宝娱乐app下载地址
< /div>
使用事件一个>< /h2>
让你的工作流程更加灵活,您可以构建工作流
对象与一个EventDispatcher
。现在可以创建事件侦听器来阻止转换(即取决于博客中的数据)和做更多的操作工作流操作发生时(如发送公告)。
每一步都有三个事件按顺序启动:
- 每个工作流事件;
- 一个事件相关工作流程;
- 为工作流事件关注特定的过渡或地名。
状态转换启动时,按照以下顺序事件派遣:
-
workflow.guard
-
验证是否允许过渡(<一个href="//www.oldmanjams.com/doc/4.1/workflow/usage.html" class="reference internal">见下文一个>)。
被派遣的三件事:
workflow.guard
工作流。(工作流的名字].guard< /code>
工作流。(工作流的名字].guard.[transition name]< /code>
-
workflow.leave
-
这个话题是关于离开的地方。
被派遣的三件事:
workflow.leave
工作流。(工作流的名字].leave< /code>
工作流。(工作流的名字].leave.[place name]< /code>
-
workflow.transition
-
这个话题正在经历这种转变。
被派遣的三件事:
workflow.transition
工作流。(工作流的名字].transition< /code>
工作流。(工作流的名字].transition.[transition name]< /code>
-
workflow.enter
-
即将进入一个新地方。这个事件被触发之前更新主题的地方,这意味着主体的标记还没有更新新的地方。
被派遣的三件事:
workflow.enter
工作流。(工作流的名字].enter< /code>
工作流。(工作流的名字].enter.[place name]< /code>
-
workflow.entered
-
这个话题已经进入了地方和更新标记(使它刷新数据原则)的好地方。
被派遣的三件事:
workflow.entered
工作流。(工作流的名字].entered< /code>
工作流。(工作流的名字].entered.[place name]< /code>
-
workflow.completed
-
对象完成了这种转变。
被派遣的三件事:
workflow.completed
工作流。(工作流的名字].completed< /code>
工作流。(工作流的名字].completed.[transition name]< /code>
-
workflow.announce
-
触发每个过渡,现在可以为主题。
被派遣的三件事:
workflow.announce
工作流。(工作流的名字].announce< /code>
工作流。(工作流的名字].announce.[transition name]< /code>
请注意跨度>< /p>离开和进入事件被触发了,即使对转换呆在同一个地方。
< /div>
这是一个例子的每次如何启用日志记录blog_publishing
工作流的叶子的地方:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29
使用跨度><跨度类="hljs-title">Psr跨度>\<跨度类="hljs-title">日志跨度>\<跨度类="hljs-title">LoggerInterface跨度>;<跨度类="hljs-keyword">使用跨度><跨度类="hljs-title">欧宝娱乐app下载地址\<跨度类="hljs-title">组件跨度>\<跨度类="hljs-title">EventDispatcher跨度>\<跨度类="hljs-title">EventSubscriberInterface跨度>;<跨度类="hljs-keyword">使用跨度><跨度类="hljs-title">欧宝娱乐app下载地址\<跨度类="hljs-title">组件跨度>\<跨度类="hljs-title">工作流跨度>\<跨度类="hljs-title">事件跨度>\<跨度类="hljs-title">事件跨度>;<跨度类="hljs-class">类跨度><跨度类="hljs-title">WorkflowLogger跨度><跨度类="hljs-keyword">实现了跨度><跨度类="hljs-title">EventSubscriberInterface跨度>< /跨度>{<跨度类="hljs-keyword">公共跨度><跨度类="hljs-function">函数跨度><跨度类="hljs-title">__construct跨度><跨度类="hljs-params">(LoggerInterface<跨度类="hljs-variable">美元跨度>日志记录器跨度>)跨度>< /跨度>{<跨度类="hljs-variable">美元跨度>这跨度><跨度类="hljs-operator">- >跨度>记录器=<跨度类="hljs-variable">美元跨度>日志记录器跨度>;}<跨度类="hljs-keyword">公共跨度><跨度类="hljs-function">函数跨度><跨度类="hljs-title">onLeave跨度><跨度类="hljs-params">(事件<跨度类="hljs-variable">美元跨度>事件跨度>)跨度>< /跨度>{<跨度类="hljs-variable">美元跨度>这跨度><跨度类="hljs-operator">- >跨度>日志记录器<跨度类="hljs-operator">- >跨度>警报(sprintf (<跨度类="hljs-string">的博客(id:“% s”)执行事务“% s”“% s”到“% s”跨度>,<跨度类="hljs-variable">美元跨度>事件跨度><跨度类="hljs-operator">- >跨度>getSubject ()<跨度类="hljs-operator">- >跨度>getId (),<跨度类="hljs-variable">美元跨度>事件跨度><跨度类="hljs-operator">- >跨度>getTransition ()<跨度类="hljs-operator">- >跨度>getName(),内爆(<跨度类="hljs-string">”、“跨度>中的(<跨度类="hljs-variable">美元跨度>事件跨度><跨度类="hljs-operator">- >跨度>getMarking ()<跨度类="hljs-operator">- >跨度>getPlaces()))、内爆(<跨度类="hljs-string">”、“跨度>,<跨度类="hljs-variable">美元跨度>事件跨度><跨度类="hljs-operator">- >跨度>getTransition ()<跨度类="hljs-operator">- >跨度>文字())));}<跨度类="hljs-keyword">公共跨度><跨度类="hljs-keyword">静态跨度><跨度类="hljs-function">函数跨度><跨度类="hljs-title">getSubscribedEvents跨度><跨度类="hljs-params">()跨度>< /跨度>{<跨度类="hljs-keyword">返回跨度>(<跨度类="hljs-string">“workflow.blog_publishing.leave”跨度>=><跨度类="hljs-string">“onLeave”跨度>,);}}
事件的方法一个>< /h3>每个工作流事件的一个实例<一个href="https://github.com/symfony/symfony/blob/4.1/src/Symfony/Component/Workflow/Event/Event.php" class="reference external" title="事件" rel="external noopener noreferrer" target="_blank">事件一个>。这就意味着每个事件获取以下信息:
-
getMarking ()一个>< /dt>
-
返回<一个href="https://github.com/symfony/symfony/blob/4.1/src/Symfony/Component/Workflow/Marking.php" class="reference external" title="标记" rel="external noopener noreferrer" target="_blank">标记一个>的工作流程。
-
getSubject ()一个>< /dt>
-
返回的对象分派事件。
-
getTransition ()一个>< /dt>
-
返回<一个href="https://github.com/symfony/symfony/blob/4.1/src/Symfony/Component/Workflow/Transition.php" class="reference external" title="过渡" rel="external noopener noreferrer" target="_blank">过渡一个>分派事件。
-
getWorkflowName ()一个>< /dt>
-
返回一个字符串的工作流,触发了事件的名称。
对保安事件,有一个扩展类<一个href="https://github.com/symfony/symfony/blob/4.1/src/Symfony/Component/Workflow/Event/GuardEvent.php" class="reference external" title="GuardEvent" rel="external noopener noreferrer" target="_blank">GuardEvent一个>。这个类有两个方法:
这项工作,包括代码示例,许可下<一个rel="license" href="https://creativecommons.org/licenses/by-sa/3.0/">Creative Commons冲锋队3.0一个>许可证。
创建一个工作流一个>< /h2>
工作流是一个过程或对象经历一个生命周期。每一个步骤或阶段的过程被称为的地方。您还做定义转换描述行动从一个地方到另一个地方。
一组和转换创建了一个地方定义。一个工作流需要一个定义
和写美国的对象(即一个实例<一个href="https://github.com/symfony/symfony/blob/4.1/src/Symfony/Component/Workflow/MarkingStore/MarkingStoreInterface.php" class="reference external" title="MarkingStoreInterface" rel="external noopener noreferrer" target="_blank">MarkingStoreInterface一个>。)
考虑下面的例子可以有这些地方的博文:草案
,审查
,拒绝了
,发表
。您可以定义工作流是这样的:
- YAML跨度>< /li>
- XML跨度>< /li>
- PHP跨度>< /li>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29
#配置/包/ workflow.yaml跨度><跨度类="hljs-attr">框架:跨度><跨度类="hljs-attr">工作流程:跨度><跨度类="hljs-attr">blog_publishing:跨度><跨度类="hljs-attr">类型:跨度><跨度类="hljs-string">“工作流程”跨度><跨度类="hljs-comment">#或“state_machine”跨度><跨度类="hljs-attr">audit_trail:跨度><跨度类="hljs-attr">启用:跨度><跨度类="hljs-literal">真正的跨度><跨度类="hljs-attr">marking_store:跨度><跨度类="hljs-attr">类型:跨度><跨度类="hljs-string">“multiple_state”跨度><跨度类="hljs-comment">#或“single_state”跨度><跨度类="hljs-attr">参数:跨度><跨度类="hljs-bullet">- - - - - -跨度><跨度类="hljs-string">“currentPlace”跨度><跨度类="hljs-attr">支持:跨度><跨度类="hljs-bullet">- - - - - -跨度><跨度类="hljs-string">App \实体\博客跨度><跨度类="hljs-attr">initial_place:跨度><跨度类="hljs-string">草案跨度><跨度类="hljs-attr">地方:跨度><跨度类="hljs-bullet">- - - - - -跨度><跨度类="hljs-string">草案跨度><跨度类="hljs-bullet">- - - - - -跨度><跨度类="hljs-string">审查跨度><跨度类="hljs-bullet">- - - - - -跨度><跨度类="hljs-string">拒绝了跨度><跨度类="hljs-bullet">- - - - - -跨度><跨度类="hljs-string">发表跨度><跨度类="hljs-attr">转换:跨度><跨度类="hljs-attr">to_review:跨度><跨度类="hljs-attr">来自:跨度><跨度类="hljs-string">草案跨度><跨度类="hljs-attr">:跨度><跨度类="hljs-string">审查跨度><跨度类="hljs-attr">发布:跨度><跨度类="hljs-attr">来自:跨度><跨度类="hljs-string">审查跨度><跨度类="hljs-attr">:跨度><跨度类="hljs-string">发表跨度><跨度类="hljs-attr">拒绝:跨度><跨度类="hljs-attr">来自:跨度><跨度类="hljs-string">审查跨度><跨度类="hljs-attr">:跨度><跨度类="hljs-string">拒绝了跨度>< /code>
1 2 3 4 5 6 7
类跨度><跨度类="hljs-title">博客跨度>< /跨度>{<跨度类="hljs-comment">/ /使用这个属性标记跨度><跨度类="hljs-keyword">公共跨度><跨度类="hljs-variable">美元跨度>currentPlace跨度>;<跨度类="hljs-keyword">公共跨度><跨度类="hljs-variable">美元跨度>标题跨度>;<跨度类="hljs-keyword">公共跨度><跨度类="hljs-variable">美元跨度>内容跨度>;}
请注意跨度>< /p>标记存储类型可能是“multiple_state”或“single_state”。一个状态标志商店不支持模型在多个地方在同一时间。
< /div>
提示跨度>< /p>的类型
(默认值single_state
),参数
(默认值标记
)的属性marking_store
选项都是可选的。如果省略,将使用默认值。
< /div>
提示跨度>< /p>设置audit_trail.enabled
选项真正的
使应用程序生成工作流活动的详细日志消息。
< /div>
使用一个工作流一个>< /h2>
一旦blog_publishing
创建工作流,您现在可以使用它来决定什么行为是允许在一篇博客文章。例如,在一个控制器的一个应用程序使用<一个href="//www.oldmanjams.com/doc/4.1/service_container.html" class="reference internal">默认的服务。yaml的配置一个>,您可以通过将工作流工作流注册服务:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35
/ /……跨度><跨度类="hljs-keyword">使用跨度><跨度类="hljs-title">欧宝娱乐app下载地址\<跨度类="hljs-title">组件跨度>\<跨度类="hljs-title">工作流跨度>\<跨度类="hljs-title">注册表跨度>;<跨度类="hljs-keyword">使用跨度><跨度类="hljs-title">应用程序跨度>\<跨度类="hljs-title">实体跨度>\<跨度类="hljs-title">博客跨度>;<跨度类="hljs-keyword">使用跨度><跨度类="hljs-title">欧宝娱乐app下载地址\<跨度类="hljs-title">包跨度>\<跨度类="hljs-title">FrameworkBundle跨度>\<跨度类="hljs-title">控制器跨度>\<跨度类="hljs-title">AbstractController跨度>;<跨度类="hljs-keyword">使用跨度><跨度类="hljs-title">欧宝娱乐app下载地址\<跨度类="hljs-title">组件跨度>\<跨度类="hljs-title">工作流跨度>\<跨度类="hljs-title">异常跨度>\<跨度类="hljs-title">TransitionException跨度>;<跨度类="hljs-class">类跨度><跨度类="hljs-title">BlogController跨度><跨度类="hljs-keyword">扩展跨度><跨度类="hljs-title">AbstractController跨度>< /跨度>{<跨度类="hljs-keyword">公共跨度><跨度类="hljs-function">函数跨度><跨度类="hljs-title">编辑跨度><跨度类="hljs-params">(注册表<跨度类="hljs-variable">美元跨度>工作流跨度>)跨度>< /跨度>{<跨度类="hljs-variable">美元跨度>帖子跨度>=<跨度类="hljs-keyword">新跨度>博客();<跨度类="hljs-variable">美元跨度>工作流跨度>=<跨度类="hljs-variable">美元跨度>工作流跨度><跨度类="hljs-operator">- >跨度>get (<跨度类="hljs-variable">美元跨度>帖子跨度>);<跨度类="hljs-comment">/ /如果有多个工作流为同一类,跨度><跨度类="hljs-comment">/ /通过工作流名称作为第二个参数跨度><跨度类="hljs-comment">/ /工作流=工作流- >得到美元($邮报,“blog_publishing”);跨度><跨度类="hljs-comment">/ /你也可以与对象相关联的所有工作流程,这是有用的跨度><跨度类="hljs-comment">/ /例如展示在后台所有工作流的状态跨度><跨度类="hljs-variable">美元跨度>postWorkflows跨度>=<跨度类="hljs-variable">美元跨度>工作流跨度><跨度类="hljs-operator">- >跨度>(<跨度类="hljs-variable">美元跨度>帖子跨度>);<跨度类="hljs-variable">美元跨度>工作流跨度><跨度类="hljs-operator">- >跨度>可以(<跨度类="hljs-variable">美元跨度>帖子跨度>,<跨度类="hljs-string">“发布”跨度>);<跨度类="hljs-comment">/ /错误跨度><跨度类="hljs-variable">美元跨度>工作流跨度><跨度类="hljs-operator">- >跨度>可以(<跨度类="hljs-variable">美元跨度>帖子跨度>,<跨度类="hljs-string">“to_review”跨度>);<跨度类="hljs-comment">/ /正确的跨度><跨度类="hljs-comment">/ /更新的现状后跨度><跨度类="hljs-keyword">试一试跨度>{<跨度类="hljs-variable">美元跨度>工作流跨度><跨度类="hljs-operator">- >跨度>应用(<跨度类="hljs-variable">美元跨度>帖子跨度>,<跨度类="hljs-string">“to_review”跨度>);}<跨度类="hljs-keyword">抓跨度>(TransitionException<跨度类="hljs-variable">美元跨度>异常跨度>){<跨度类="hljs-comment">/ /……如果过渡是不允许的跨度>}<跨度类="hljs-comment">/ /查看所有可用的转换后的当前状态跨度><跨度类="hljs-variable">美元跨度>转换跨度>=<跨度类="hljs-variable">美元跨度>工作流跨度><跨度类="hljs-operator">- >跨度>getEnabledTransitions (<跨度类="hljs-variable">美元跨度>帖子跨度>);}}
4.1跨度>< /p>的<一个href="https://github.com/symfony/symfony/blob/4.1/src/Symfony/Component/Workflow/Exception/TransitionException.php" class="reference external" title="TransitionException" rel="external noopener noreferrer" target="_blank">TransitionException一个>类是在Symfony 4.1中引入的。欧宝娱乐app下载地址
< /div>
4.1跨度>< /p>的<一个href="https://github.com/symfony/symfony/blob/4.1/src/Symfony/Component/Workflow/Registry.php" class="reference external" title="所有()" rel="external noopener noreferrer" target="_blank">所有()一个>方法是在Symfony 4.1中引入的。欧宝娱乐app下载地址
< /div>
使用事件一个>< /h2>
让你的工作流程更加灵活,您可以构建工作流
对象与一个EventDispatcher
。现在可以创建事件侦听器来阻止转换(即取决于博客中的数据)和做更多的操作工作流操作发生时(如发送公告)。
每一步都有三个事件按顺序启动:
- 每个工作流事件;
- 一个事件相关工作流程;
- 为工作流事件关注特定的过渡或地名。
状态转换启动时,按照以下顺序事件派遣:
-
workflow.guard
-
验证是否允许过渡(<一个href="//www.oldmanjams.com/doc/4.1/workflow/usage.html" class="reference internal">见下文一个>)。
被派遣的三件事:
workflow.guard
工作流。(工作流的名字].guard< /code>
工作流。(工作流的名字].guard.[transition name]< /code>
-
workflow.leave
-
这个话题是关于离开的地方。
被派遣的三件事:
workflow.leave
工作流。(工作流的名字].leave< /code>
工作流。(工作流的名字].leave.[place name]< /code>
-
workflow.transition
-
这个话题正在经历这种转变。
被派遣的三件事:
workflow.transition
工作流。(工作流的名字].transition< /code>
工作流。(工作流的名字].transition.[transition name]< /code>
-
workflow.enter
-
即将进入一个新地方。这个事件被触发之前更新主题的地方,这意味着主体的标记还没有更新新的地方。
被派遣的三件事:
workflow.enter
工作流。(工作流的名字].enter< /code>
工作流。(工作流的名字].enter.[place name]< /code>
-
workflow.entered
-
这个话题已经进入了地方和更新标记(使它刷新数据原则)的好地方。
被派遣的三件事:
workflow.entered
工作流。(工作流的名字].entered< /code>
工作流。(工作流的名字].entered.[place name]< /code>
-
workflow.completed
-
对象完成了这种转变。
被派遣的三件事:
workflow.completed
工作流。(工作流的名字].completed< /code>
工作流。(工作流的名字].completed.[transition name]< /code>
-
workflow.announce
-
触发每个过渡,现在可以为主题。
被派遣的三件事:
workflow.announce
工作流。(工作流的名字].announce< /code>
工作流。(工作流的名字].announce.[transition name]< /code>
请注意跨度>< /p>离开和进入事件被触发了,即使对转换呆在同一个地方。
< /div>
这是一个例子的每次如何启用日志记录blog_publishing
工作流的叶子的地方:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29
使用跨度><跨度类="hljs-title">Psr跨度>\<跨度类="hljs-title">日志跨度>\<跨度类="hljs-title">LoggerInterface跨度>;<跨度类="hljs-keyword">使用跨度><跨度类="hljs-title">欧宝娱乐app下载地址\<跨度类="hljs-title">组件跨度>\<跨度类="hljs-title">EventDispatcher跨度>\<跨度类="hljs-title">EventSubscriberInterface跨度>;<跨度类="hljs-keyword">使用跨度><跨度类="hljs-title">欧宝娱乐app下载地址\<跨度类="hljs-title">组件跨度>\<跨度类="hljs-title">工作流跨度>\<跨度类="hljs-title">事件跨度>\<跨度类="hljs-title">事件跨度>;<跨度类="hljs-class">类跨度><跨度类="hljs-title">WorkflowLogger跨度><跨度类="hljs-keyword">实现了跨度><跨度类="hljs-title">EventSubscriberInterface跨度>< /跨度>{<跨度类="hljs-keyword">公共跨度><跨度类="hljs-function">函数跨度><跨度类="hljs-title">__construct跨度><跨度类="hljs-params">(LoggerInterface<跨度类="hljs-variable">美元跨度>日志记录器跨度>)跨度>< /跨度>{<跨度类="hljs-variable">美元跨度>这跨度><跨度类="hljs-operator">- >跨度>记录器=<跨度类="hljs-variable">美元跨度>日志记录器跨度>;}<跨度类="hljs-keyword">公共跨度><跨度类="hljs-function">函数跨度><跨度类="hljs-title">onLeave跨度><跨度类="hljs-params">(事件<跨度类="hljs-variable">美元跨度>事件跨度>)跨度>< /跨度>{<跨度类="hljs-variable">美元跨度>这跨度><跨度类="hljs-operator">- >跨度>日志记录器<跨度类="hljs-operator">- >跨度>警报(sprintf (<跨度类="hljs-string">的博客(id:“% s”)执行事务“% s”“% s”到“% s”跨度>,<跨度类="hljs-variable">美元跨度>事件跨度><跨度类="hljs-operator">- >跨度>getSubject ()<跨度类="hljs-operator">- >跨度>getId (),<跨度类="hljs-variable">美元跨度>事件跨度><跨度类="hljs-operator">- >跨度>getTransition ()<跨度类="hljs-operator">- >跨度>getName(),内爆(<跨度类="hljs-string">”、“跨度>中的(<跨度类="hljs-variable">美元跨度>事件跨度><跨度类="hljs-operator">- >跨度>getMarking ()<跨度类="hljs-operator">- >跨度>getPlaces()))、内爆(<跨度类="hljs-string">”、“跨度>,<跨度类="hljs-variable">美元跨度>事件跨度><跨度类="hljs-operator">- >跨度>getTransition ()<跨度类="hljs-operator">- >跨度>文字())));}<跨度类="hljs-keyword">公共跨度><跨度类="hljs-keyword">静态跨度><跨度类="hljs-function">函数跨度><跨度类="hljs-title">getSubscribedEvents跨度><跨度类="hljs-params">()跨度>< /跨度>{<跨度类="hljs-keyword">返回跨度>(<跨度类="hljs-string">“workflow.blog_publishing.leave”跨度>=><跨度类="hljs-string">“onLeave”跨度>,);}}
事件的方法一个>< /h3>每个工作流事件的一个实例<一个href="https://github.com/symfony/symfony/blob/4.1/src/Symfony/Component/Workflow/Event/Event.php" class="reference external" title="事件" rel="external noopener noreferrer" target="_blank">事件一个>。这就意味着每个事件获取以下信息:
-
getMarking ()一个>< /dt>
-
返回<一个href="https://github.com/symfony/symfony/blob/4.1/src/Symfony/Component/Workflow/Marking.php" class="reference external" title="标记" rel="external noopener noreferrer" target="_blank">标记一个>的工作流程。
-
getSubject ()一个>< /dt>
-
返回的对象分派事件。
-
getTransition ()一个>< /dt>
-
返回<一个href="https://github.com/symfony/symfony/blob/4.1/src/Symfony/Component/Workflow/Transition.php" class="reference external" title="过渡" rel="external noopener noreferrer" target="_blank">过渡一个>分派事件。
-
getWorkflowName ()一个>< /dt>
-
返回一个字符串的工作流,触发了事件的名称。
对保安事件,有一个扩展类<一个href="https://github.com/symfony/symfony/blob/4.1/src/Symfony/Component/Workflow/Event/GuardEvent.php" class="reference external" title="GuardEvent" rel="external noopener noreferrer" target="_blank">GuardEvent一个>。这个类有两个方法:
这项工作,包括代码示例,许可下<一个rel="license" href="https://creativecommons.org/licenses/by-sa/3.0/">Creative Commons冲锋队3.0一个>许可证。
定义
和写美国的对象(即一个实例<一个href="https://github.com/symfony/symfony/blob/4.1/src/Symfony/Component/Workflow/MarkingStore/MarkingStoreInterface.php" class="reference external" title="MarkingStoreInterface" rel="external noopener noreferrer" target="_blank">MarkingStoreInterface一个>。)草案
,审查
,拒绝了
,发表
。您可以定义工作流是这样的:- YAML跨度>< /li>
- XML跨度>< /li>
- PHP跨度>< /li>
- XML跨度>< /li>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29
#配置/包/ workflow.yaml跨度><跨度类="hljs-attr">框架:跨度><跨度类="hljs-attr">工作流程:跨度><跨度类="hljs-attr">blog_publishing:跨度><跨度类="hljs-attr">类型:跨度><跨度类="hljs-string">“工作流程”跨度><跨度类="hljs-comment">#或“state_machine”跨度><跨度类="hljs-attr">audit_trail:跨度><跨度类="hljs-attr">启用:跨度><跨度类="hljs-literal">真正的跨度><跨度类="hljs-attr">marking_store:跨度><跨度类="hljs-attr">类型:跨度><跨度类="hljs-string">“multiple_state”跨度><跨度类="hljs-comment">#或“single_state”跨度><跨度类="hljs-attr">参数:跨度><跨度类="hljs-bullet">- - - - - -跨度><跨度类="hljs-string">“currentPlace”跨度><跨度类="hljs-attr">支持:跨度><跨度类="hljs-bullet">- - - - - -跨度><跨度类="hljs-string">App \实体\博客跨度><跨度类="hljs-attr">initial_place:跨度><跨度类="hljs-string">草案跨度><跨度类="hljs-attr">地方:跨度><跨度类="hljs-bullet">- - - - - -跨度><跨度类="hljs-string">草案跨度><跨度类="hljs-bullet">- - - - - -跨度><跨度类="hljs-string">审查跨度><跨度类="hljs-bullet">- - - - - -跨度><跨度类="hljs-string">拒绝了跨度><跨度类="hljs-bullet">- - - - - -跨度><跨度类="hljs-string">发表跨度><跨度类="hljs-attr">转换:跨度><跨度类="hljs-attr">to_review:跨度><跨度类="hljs-attr">来自:跨度><跨度类="hljs-string">草案跨度><跨度类="hljs-attr">:跨度><跨度类="hljs-string">审查跨度><跨度类="hljs-attr">发布:跨度><跨度类="hljs-attr">来自:跨度><跨度类="hljs-string">审查跨度><跨度类="hljs-attr">:跨度><跨度类="hljs-string">发表跨度><跨度类="hljs-attr">拒绝:跨度><跨度类="hljs-attr">来自:跨度><跨度类="hljs-string">审查跨度><跨度类="hljs-attr">:跨度><跨度类="hljs-string">拒绝了跨度>< /code>
1 2 3 4 5 6 7
类跨度><跨度类="hljs-title">博客跨度>< /跨度>{<跨度类="hljs-comment">/ /使用这个属性标记跨度><跨度类="hljs-keyword">公共跨度><跨度类="hljs-variable">美元跨度>currentPlace跨度>;<跨度类="hljs-keyword">公共跨度><跨度类="hljs-variable">美元跨度>标题跨度>;<跨度类="hljs-keyword">公共跨度><跨度类="hljs-variable">美元跨度>内容跨度>;}
请注意跨度>< /p> 标记存储类型可能是“multiple_state”或“single_state”。一个状态标志商店不支持模型在多个地方在同一时间。
提示跨度>< /p> 的
提示跨度>< /p> 设置 一旦 4.1跨度>< /p> 的<一个href="https://github.com/symfony/symfony/blob/4.1/src/Symfony/Component/Workflow/Exception/TransitionException.php" class="reference external" title="TransitionException" rel="external noopener noreferrer" target="_blank">TransitionException一个>类是在Symfony 4.1中引入的。欧宝娱乐app下载地址 4.1跨度>< /p> 的<一个href="https://github.com/symfony/symfony/blob/4.1/src/Symfony/Component/Workflow/Registry.php" class="reference external" title="所有()" rel="external noopener noreferrer" target="_blank">所有()一个>方法是在Symfony 4.1中引入的。欧宝娱乐app下载地址 让你的工作流程更加灵活,您可以构建 每一步都有三个事件按顺序启动: 状态转换启动时,按照以下顺序事件派遣: 验证是否允许过渡(<一个href="//www.oldmanjams.com/doc/4.1/workflow/usage.html" class="reference internal">见下文一个>)。 被派遣的三件事: 这个话题是关于离开的地方。 被派遣的三件事: 这个话题正在经历这种转变。 被派遣的三件事: 即将进入一个新地方。这个事件被触发之前更新主题的地方,这意味着主体的标记还没有更新新的地方。 被派遣的三件事: 这个话题已经进入了地方和更新标记(使它刷新数据原则)的好地方。 被派遣的三件事: 对象完成了这种转变。 被派遣的三件事: 触发每个过渡,现在可以为主题。 被派遣的三件事:
请注意跨度>< /p> 离开和进入事件被触发了,即使对转换呆在同一个地方。 这是一个例子的每次如何启用日志记录 每个工作流事件的一个实例<一个href="https://github.com/symfony/symfony/blob/4.1/src/Symfony/Component/Workflow/Event/Event.php" class="reference external" title="事件" rel="external noopener noreferrer" target="_blank">事件一个>。这就意味着每个事件获取以下信息: 对保安事件,有一个扩展类<一个href="https://github.com/symfony/symfony/blob/4.1/src/Symfony/Component/Workflow/Event/GuardEvent.php" class="reference external" title="GuardEvent" rel="external noopener noreferrer" target="_blank">GuardEvent一个>。这个类有两个方法:类型
(默认值single_state
),参数
(默认值标记
)的属性marking_store
选项都是可选的。如果省略,将使用默认值。audit_trail.enabled
选项真正的
使应用程序生成工作流活动的详细日志消息。使用一个工作流一个>< /h2>
blog_publishing
创建工作流,您现在可以使用它来决定什么行为是允许在一篇博客文章。例如,在一个控制器的一个应用程序使用<一个href="//www.oldmanjams.com/doc/4.1/service_container.html" class="reference internal">默认的服务。yaml的配置一个>,您可以通过将工作流工作流注册服务:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29 30 31 32 33 34 35
/ /……跨度><跨度类="hljs-keyword">使用跨度><跨度类="hljs-title">欧宝娱乐app下载地址\<跨度类="hljs-title">组件跨度>\<跨度类="hljs-title">工作流跨度>\<跨度类="hljs-title">注册表跨度>;<跨度类="hljs-keyword">使用跨度><跨度类="hljs-title">应用程序跨度>\<跨度类="hljs-title">实体跨度>\<跨度类="hljs-title">博客跨度>;<跨度类="hljs-keyword">使用跨度><跨度类="hljs-title">欧宝娱乐app下载地址\<跨度类="hljs-title">包跨度>\<跨度类="hljs-title">FrameworkBundle跨度>\<跨度类="hljs-title">控制器跨度>\<跨度类="hljs-title">AbstractController跨度>;<跨度类="hljs-keyword">使用跨度><跨度类="hljs-title">欧宝娱乐app下载地址\<跨度类="hljs-title">组件跨度>\<跨度类="hljs-title">工作流跨度>\<跨度类="hljs-title">异常跨度>\<跨度类="hljs-title">TransitionException跨度>;<跨度类="hljs-class">类跨度><跨度类="hljs-title">BlogController跨度><跨度类="hljs-keyword">扩展跨度><跨度类="hljs-title">AbstractController跨度>< /跨度>{<跨度类="hljs-keyword">公共跨度><跨度类="hljs-function">函数跨度><跨度类="hljs-title">编辑跨度><跨度类="hljs-params">(注册表<跨度类="hljs-variable">美元跨度>工作流跨度>)跨度>< /跨度>{<跨度类="hljs-variable">美元跨度>帖子跨度>=<跨度类="hljs-keyword">新跨度>博客();<跨度类="hljs-variable">美元跨度>工作流跨度>=<跨度类="hljs-variable">美元跨度>工作流跨度><跨度类="hljs-operator">- >跨度>get (<跨度类="hljs-variable">美元跨度>帖子跨度>);<跨度类="hljs-comment">/ /如果有多个工作流为同一类,跨度><跨度类="hljs-comment">/ /通过工作流名称作为第二个参数跨度><跨度类="hljs-comment">/ /工作流=工作流- >得到美元($邮报,“blog_publishing”);跨度><跨度类="hljs-comment">/ /你也可以与对象相关联的所有工作流程,这是有用的跨度><跨度类="hljs-comment">/ /例如展示在后台所有工作流的状态跨度><跨度类="hljs-variable">美元跨度>postWorkflows跨度>=<跨度类="hljs-variable">美元跨度>工作流跨度><跨度类="hljs-operator">- >跨度>(<跨度类="hljs-variable">美元跨度>帖子跨度>);<跨度类="hljs-variable">美元跨度>工作流跨度><跨度类="hljs-operator">- >跨度>可以(<跨度类="hljs-variable">美元跨度>帖子跨度>,<跨度类="hljs-string">“发布”跨度>);<跨度类="hljs-comment">/ /错误跨度><跨度类="hljs-variable">美元跨度>工作流跨度><跨度类="hljs-operator">- >跨度>可以(<跨度类="hljs-variable">美元跨度>帖子跨度>,<跨度类="hljs-string">“to_review”跨度>);<跨度类="hljs-comment">/ /正确的跨度><跨度类="hljs-comment">/ /更新的现状后跨度><跨度类="hljs-keyword">试一试跨度>{<跨度类="hljs-variable">美元跨度>工作流跨度><跨度类="hljs-operator">- >跨度>应用(<跨度类="hljs-variable">美元跨度>帖子跨度>,<跨度类="hljs-string">“to_review”跨度>);}<跨度类="hljs-keyword">抓跨度>(TransitionException<跨度类="hljs-variable">美元跨度>异常跨度>){<跨度类="hljs-comment">/ /……如果过渡是不允许的跨度>}<跨度类="hljs-comment">/ /查看所有可用的转换后的当前状态跨度><跨度类="hljs-variable">美元跨度>转换跨度>=<跨度类="hljs-variable">美元跨度>工作流跨度><跨度类="hljs-operator">- >跨度>getEnabledTransitions (<跨度类="hljs-variable">美元跨度>帖子跨度>);}}
使用事件一个>< /h2>
工作流
对象与一个EventDispatcher
。现在可以创建事件侦听器来阻止转换(即取决于博客中的数据)和做更多的操作工作流操作发生时(如发送公告)。
workflow.guard
workflow.guard
工作流。(工作流的名字].guard< /code>
工作流。(工作流的名字].guard.[transition name]< /code>
workflow.leave
workflow.leave
工作流。(工作流的名字].leave< /code>
工作流。(工作流的名字].leave.[place name]< /code>
workflow.transition
workflow.transition
工作流。(工作流的名字].transition< /code>
工作流。(工作流的名字].transition.[transition name]< /code>
workflow.enter
workflow.enter
工作流。(工作流的名字].enter< /code>
工作流。(工作流的名字].enter.[place name]< /code>
workflow.entered
workflow.entered
工作流。(工作流的名字].entered< /code>
工作流。(工作流的名字].entered.[place name]< /code>
workflow.completed
workflow.completed
工作流。(工作流的名字].completed< /code>
工作流。(工作流的名字].completed.[transition name]< /code>
workflow.announce
workflow.announce
工作流。(工作流的名字].announce< /code>
工作流。(工作流的名字].announce.[transition name]< /code>
blog_publishing
工作流的叶子的地方:1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17日18 19 20 21日22日23日24日25日26日27 28 29
使用跨度><跨度类="hljs-title">Psr跨度>\<跨度类="hljs-title">日志跨度>\<跨度类="hljs-title">LoggerInterface跨度>;<跨度类="hljs-keyword">使用跨度><跨度类="hljs-title">欧宝娱乐app下载地址\<跨度类="hljs-title">组件跨度>\<跨度类="hljs-title">EventDispatcher跨度>\<跨度类="hljs-title">EventSubscriberInterface跨度>;<跨度类="hljs-keyword">使用跨度><跨度类="hljs-title">欧宝娱乐app下载地址\<跨度类="hljs-title">组件跨度>\<跨度类="hljs-title">工作流跨度>\<跨度类="hljs-title">事件跨度>\<跨度类="hljs-title">事件跨度>;<跨度类="hljs-class">类跨度><跨度类="hljs-title">WorkflowLogger跨度><跨度类="hljs-keyword">实现了跨度><跨度类="hljs-title">EventSubscriberInterface跨度>< /跨度>{<跨度类="hljs-keyword">公共跨度><跨度类="hljs-function">函数跨度><跨度类="hljs-title">__construct跨度><跨度类="hljs-params">(LoggerInterface<跨度类="hljs-variable">美元跨度>日志记录器跨度>)跨度>< /跨度>{<跨度类="hljs-variable">美元跨度>这跨度><跨度类="hljs-operator">- >跨度>记录器=<跨度类="hljs-variable">美元跨度>日志记录器跨度>;}<跨度类="hljs-keyword">公共跨度><跨度类="hljs-function">函数跨度><跨度类="hljs-title">onLeave跨度><跨度类="hljs-params">(事件<跨度类="hljs-variable">美元跨度>事件跨度>)跨度>< /跨度>{<跨度类="hljs-variable">美元跨度>这跨度><跨度类="hljs-operator">- >跨度>日志记录器<跨度类="hljs-operator">- >跨度>警报(sprintf (<跨度类="hljs-string">的博客(id:“% s”)执行事务“% s”“% s”到“% s”跨度>,<跨度类="hljs-variable">美元跨度>事件跨度><跨度类="hljs-operator">- >跨度>getSubject ()<跨度类="hljs-operator">- >跨度>getId (),<跨度类="hljs-variable">美元跨度>事件跨度><跨度类="hljs-operator">- >跨度>getTransition ()<跨度类="hljs-operator">- >跨度>getName(),内爆(<跨度类="hljs-string">”、“跨度>中的(<跨度类="hljs-variable">美元跨度>事件跨度><跨度类="hljs-operator">- >跨度>getMarking ()<跨度类="hljs-operator">- >跨度>getPlaces()))、内爆(<跨度类="hljs-string">”、“跨度>,<跨度类="hljs-variable">美元跨度>事件跨度><跨度类="hljs-operator">- >跨度>getTransition ()<跨度类="hljs-operator">- >跨度>文字())));}<跨度类="hljs-keyword">公共跨度><跨度类="hljs-keyword">静态跨度><跨度类="hljs-function">函数跨度><跨度类="hljs-title">getSubscribedEvents跨度><跨度类="hljs-params">()跨度>< /跨度>{<跨度类="hljs-keyword">返回跨度>(<跨度类="hljs-string">“workflow.blog_publishing.leave”跨度>=><跨度类="hljs-string">“onLeave”跨度>,);}}
事件的方法一个>< /h3>