jinowom/yii2-workflow

为 Yii2 设计的简单工作流引擎

安装: 19

依赖项: 2

建议者: 0

安全: 0

星标: 0

关注者: 0

分支: 0

开放问题: 0

类型:yii2-extension

v1.2.0 2022-10-30 06:25 UTC

This package is auto-updated.

Last update: 2024-09-30 01:43:36 UTC


README

Build Latest Stable Version Total Downloads License

安装

安装此扩展的首选方式是通过 composer

运行以下命令之一

php composer.phar require --prefer-dist jinowom/yii2-workflow "*"

或者在您的 composer.json 文件的 require 部分添加以下内容

"jinowom/yii2-workflow": "*"

快速入门

配置

对于这个 "快速入门指南",我们将使用 默认配置设置,但请记住,yii2-workflow 被设计为高度灵活,以便适应许多执行上下文……至少这是我目标。

创建工作流

工作流被定义为实现 \jinowom\workflow\source\file\IWorkflowDefinitionProvider 接口的 PHP 类,该接口声明了 getDefinition() 方法。此方法必须返回表示工作流定义的数组。

让我们定义一个非常 简单的工作流,该工作流将用于管理基本博客系统中的帖子。

以下是我们实现工作流定义的 PHP 类

@app/models/PostWorkflow.php

namespace app\models;

class PostWorkflow implements \jinowom\workflow\source\file\IWorkflowDefinitionProvider
{
	public function getDefinition() {
		return [
			'initialStatusId' => 'draft',
			'status' => [
				'draft' => [
					'transition' => ['publish','deleted']
				],
				'publish' => [
					'transition' => ['draft','deleted']
				],
				'deleted' => [
					'transition' => ['draft']
				]
			]
		];
	}
}

附加到模型

现在让我们看看我们的 Post 模型:我们在名为 status 的列中存储帖子的状态,列类型为 STRING(40)。

最后一步是将工作流定义与帖子模型关联起来。为此,我们必须在 Post 模型类中声明 SimpleWorkflowBehavior 行为,并让默认配置设置完成剩余的工作。

@app/models/Post.php

namespace app\models;
/**
 * @property integer $id
 * @property string $title
 * @property string $body
 * @property string $status column used to store the status of the post
 */
class Post extends \yii\db\ActiveRecord
{
    public function behaviors()
    {
    	return [
			\jinowom\workflow\base\SimpleWorkflowBehavior::className()
    	];
    }
    // ...

就这样!我们现在可以开始玩 SimpleWorkflowBehavior 了。

使用它!

现在我们已经全部设置好了,我们可以使用 SimpleWorkflowBehavior 方法来设置/获取帖子的状态:SimpleWorkflowBehavior 将确保帖子不会达到根据我们提供的工作流定义不应该到达的状态。

$post = new Post();
$post->status = 'draft';
$post->save();
echo 'post status is : '. $post->workflowStatus->label;

这将打印以下消息

post status is : Draft

如果您做同样的事情,但将状态设置为 publish 而不是 draft 并尝试保存,则将抛出以下异常

Not an initial status : PostWorkflow/publish ("PostWorkflow/draft" expected)

这是因为您的流程定义中 初始状态 设置为 draft 而不是 publish

好吧,再举一个例子,仅供娱乐!这次我们不是在帖子保存时执行转换(如前一个示例中那样),而是立即通过调用 sendToStatus 方法执行转换。我们的帖子将尝试通过 deleted(这是工作流严格禁止的)过渡到 publish 状态。它在这场危险的破坏工作流规则的尝试中会成功吗?

$post = new Post();
$post->sendToStatus('draft');
$post->sendToStatus('deleted');
$post->sendToStatus('publish');	// danger zone !

游戏结束!在 deletedpublish 之间没有转换,这正是 SimpleWorkflow 尝试向我们的无畏帖子对象解释的。

Workflow Exception – jinowom\workflow\base\WorkflowException
No transition found between status PostWorkflow/deleted and PostWorkflow/publish

是的,这很严重,但有很多方法可以避免这种异常,例如首先验证转换是否可行。

接下来是什么?

这仅仅是使用 SimpleWorkflowBehavior 的方法之一,但还有更多,希望足够帮助您在 Yii2 网络应用中管理工作流。

您可以在那里找到更多信息

您可能还对以下围绕 yii2-workflow 开发的项目感兴趣

许可证

yii2-workflow采用BSD 3-Clause许可证发布。有关详细信息,请参阅捆绑的LICENSE.md文件。

Yii2