raoul2000 / yii2-workflow
为Yii2的一个简单工作流引擎
Requires
- php: >=5.4.0
- yiisoft/yii2: ~2.0.13
Requires (Dev)
- codeception/assert-throws: ^1.0
- codeception/codeception: >= 2.0.9
- codeception/specify: *
- codeception/verify: *
- myclabs/deep-copy: >= 1.3.1
- yiisoft/yii2-codeception: *
This package is not auto-updated.
Last update: 2024-09-23 14:44:16 UTC
README
安装
通过Composer安装此扩展是首选方式。
可以运行
php composer.phar require --prefer-dist raoul2000/yii2-workflow "*"
或者在您的composer.json
文件的require部分添加
"raoul2000/yii2-workflow": "*"
快速入门
配置
在这个"快速入门指南"中,我们将使用默认配置设置,但请记住,yii2-workflow被设计成高度灵活,以适应许多执行上下文...至少这是我目标。
创建工作流
工作流被定义为实现了\raoul2000\workflow\source\file\IWorkflowDefinitionProvider
接口的PHP类,该接口声明了getDefinition()方法。此方法必须返回表示工作流定义的数组。
让我们定义一个非常简单的工作流,它将被用于管理基本博客系统中的帖子。
以下是实现我们的工作流定义的PHP类
@app/models/PostWorkflow.php
namespace app\models; class PostWorkflow implements \raoul2000\workflow\source\file\IWorkflowDefinitionProvider { public function getDefinition() { return [ 'initialStatusId' => 'draft', 'status' => [ 'draft' => [ 'transition' => ['publish','deleted'] ], 'publish' => [ 'transition' => ['draft','deleted'] ], 'deleted' => [ 'transition' => ['draft'] ] ] ]; } }
附加到模型
现在让我们看看我们的帖子模型:我们将在名为status
的字符串(40)类型的列中存储帖子的状态。
最后一步是将工作流定义与帖子模型相关联。为此,我们必须在帖子模型类中声明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 [ \raoul2000\workflow\base\SimpleWorkflowBehavior::className() ]; } // ...
就这样!我们现在可以开始玩SimpleWorkflowBehavior了。
使用它!
现在我们已经全部设置好了,我们可以使用SimpleWorkflowBehavior的方法来设置/获取帖子的状态:SimpleWorkflowBehavior将确保帖子不会达到不应到达的状态,这取决于我们提供的 workflow 定义。
$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)
这是因为在你提供的 workflow 定义中,初始状态被设置为draft而不是publish。
好的,再举一个例子!这次我们不会在帖子保存时执行转换(就像上一个例子中那样),而是立即通过调用sendToStatus
方法。我们的帖子将尝试通过deleted状态到达publish状态,这是工作流严格禁止的。在这种危险的尝试中打破工作流规则,它能够成功吗?
$post = new Post(); $post->sendToStatus('draft'); $post->sendToStatus('deleted'); $post->sendToStatus('publish'); // danger zone !
游戏结束!在deleted和publish之间没有转换,这正是SimpleWorkflow试图向我们勇敢的帖子对象说明的。
Workflow Exception – raoul2000\workflow\base\WorkflowException
No transition found between status PostWorkflow/deleted and PostWorkflow/publish
是的,这很严重,但有很多方法可以避免这种异常,例如,首先验证转换是否可行。
接下来是什么?
这仅仅是使用SimpleWorkflowBehavior的一种方式,但还有很多其他方式,希望这足以帮助你在Yii2 web应用中管理工作流。
你可以在那里找到更多信息
- yii2-workflow 使用指南
- yii2-workflow 类参考
- 演示:基于Post用例的一个简单示例。
您可能还对以下基于yii2-workflow开发的工程感兴趣
- yii2-workflow-view:用于显示工作流的Widget(演示)
- yii2-workflow-manager:用于管理工作流的模块
- yii2-wizflow:将向导UI模式与工作流混合的验证概念(演示)
- ...还有更多即将到来
许可证
yii2-workflow采用BSD 3-Clause许可证发布。有关详细信息,请参阅附带文件LICENSE.md
。