hjp1011/yii2-workflow

Yii2的一个简单工作流引擎

安装: 17

依赖: 1

建议者: 0

安全性: 0

星星: 0

关注者: 1

分支: 0

开放问题: 0

类型:yii2-extension

1.0.0 2023-05-16 18:03 UTC

This package is not auto-updated.

Last update: 2024-10-02 00:25:38 UTC


README

Latest Stable Version Total Downloads Latest Unstable Version License PHP Version Require

安装

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

运行以下命令:

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

或将以下内容添加到您的composer.json文件的require部分:

"hjp1011/yii2-workflow": "*"

快速入门

配置

在本《快速入门指南》中,我们将使用默认配置设置,但请记住,yii2-workflow旨在高度灵活,以适应许多执行上下文...至少这是我的目标。

创建工作流

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

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

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

@app/models/PostWorkflow.php

namespace app\models;

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

附加到模型

现在让我们看看我们的Post模型:我们将在名为status的字符串(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 [
			\hjp1011\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而不是草稿并尝试保存它,将抛出以下异常:

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

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

好的,再举一个例子来增加乐趣!这次我们不会在Post保存时执行转换(就像上一个例子中那样),而是立即通过调用sendToStatus方法。我们的Post将尝试通过deleted状态达到publish状态,这是工作流严格禁止的。在这个危险的尝试打破工作流规则中,它将成功吗?

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

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

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

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

接下来是什么?

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

您可能还感兴趣以下基于yii2-workflow开发的项目:

许可证

yii2-workflow 采用 BSD 3-Clause 许可协议发布。有关详细信息,请参阅附带文件 LICENSE.md

Yii2