rhaarhoff/workflow

此包的最新版本(v1.0.8)没有可用的许可证信息。

创建指定的工作流

v1.0.8 2020-04-18 19:21 UTC

README

Latest Stable Version Software License Total Stars Total Downloads

描述

此包提供了一种从定义生成工作流定义和工作流的方法。

有关如何使用此功能的示例项目,请访问 workflow-example github 页面。

安装

使用以下命令通过 Composer 安装此包

composer require rhaarhoff/workflow

更新 Composer 后,将服务提供者添加到 config/app.php 文件中的 providers 数组

Rhaarhoff\Workflow\WorkflowServiceProvider::class

运行 dump-autoload 命令

composer dump-autoload

在 Laravel 中,您可以在 app/Providers/AppServiceProvider.php 文件中的 register() 方法中添加以下代码,而不是在 config/app.php 文件中添加服务提供者

public function register()
{
    if ($this->app->environment() !== 'production') {
        $this->app->register(\Rhaarhoff\Workflow\WorkflowServiceProvider::class);
    }
    // ...
}

命令

以下是可以使用的所有命令,包括您可以指定的参数。

COMMAND                     PARAMETER             DESCRIPTION
-----------------------------------------------------------------------------------------------------------------------
workflow:create <name>                              Generates a workflow definition with the given name
workflow:create <name>        -s <start state>      Generates a workflow definition with the given name & start state
workflow:generate <name>                            Generates workflows for the specified workflow name in the Workflow folder
workflow:generate                                   Generates all workflows from all definitions in the Workflow folder

如何工作

工作流类似于状态机(有关更多信息,请参阅此处)。基本上,工作流被分成多个 '状态' 或 '步骤',每个步骤接收一个输入,执行一些逻辑,并返回一个输出。工作流的最终目标是接收输入,通过定义的步骤和转换进行过渡,并在最后给出输出。

设置定义文件

运行创建定义文件的命令后,例如 php artisan workflow:create Example,您将看到如下内容:

{
    "name": "Example",
    "uses": [],
    "namespace": "App\\Workflows\\Example",
    "startState": "start_state_function_name",
    "input": {
        "input_name": "input_type"
    },
    "output": {
        "return_name": "return_type"
    },
    "workflow": {
        "start_state_function_name": {
            "parameters": {
                "parameter_name": "parameter_type"
            },
            "result": {
                "return_value": "return_type"
            },
            "transition": {
                "function_name": ""
            }
        }
    }
}

这一切意味着什么?请参阅下表

DEFINITION PARAMETER         DESCRIPTION
----------------------------------------------------------------------------------------------
name                         The name of the workflow
uses                         The imports (use) of the workflow
namespace                    The namespace of the workflow
startState                   The function name which to start from in the workflow
input                        The list of input parameters and their type
output                       The output parameter and its type
workflow                     This is the list of workflow states / steps,
                             each listing their input parameters, result and
                             transition requirements to the next workflow state

为了创建一个工作的定义文件,所有信息都需要在占位符字段中提供。有关工作流定义文件所有功能的良好示例,请参阅以下内容

{
    "name": "UserUpdate",
    "uses": [
        "App\\User",
        "Common\\Id",
        "Common\\Status",
        "Common\\Contact"
    ],
    "namespace": "App\\Workflows\\UserUpdate",
    "startState": "GetExistingUserOrNull",
    "input": {
        "id": "Id",
        "name": "string|null",
        "status": "Status|null",
        "allContact": "Contact[]|null"
    },
    "output": {
        "user": "User"
    },
    "workflow": {
        "GetExistingUserOrNull": {
            "parameters": {
                "id": "Id"
            },
            "result": {
                "user": "User|null"
            },
            "transition": {
                "End": "is_null($this->user) === true",
                "ShouldUpdateUser": "is_null($this->user) === false"
            }
        },
        "ShouldUpdateUser": {
            "parameters": {
                "user": "User",
                "name": "string|null",
                "status": "Status|null",
                "allContact": "Contact[]|null"
            },
            "result": {
                "shouldUpdateUser": "bool"
            },
            "transition": {
                "End": "$this->shouldUpdateUser === false",
                "UpdateUser": "$this->shouldUpdateUser === true"
            }
        },
        "UpdateUser": {
            "parameters": {
                "user": "User",
                "name": "string|null",
                "status": "Status|null",
                "allContact": "Contact[]|null"
            },
            "result": {
                "user": "User"
            },
            "transition": {
                "End": ""
            }
        }
    }
}

您可以看到在此工作流中有 三个 转换

  • GetExistingUserOrNull 是 起始状态,并且仅在指定的条件满足时才转换到 ShouldUpdateUser,否则转换到 End
  • ShouldUpdateUser 仅在条件满足时转换到 UpdateUser,否则转换到 End
  • UpdateUser 仅转换到 End,没有指定条件。

有关工作流状态的附加信息

  • 每个工作流状态可以接受 零个或多个参数作为输入,并且只能指定 一个输出
  • 请确保指定的 startState 是您定义的第一个工作流状态。
  • 对于每个工作流转换条件,请确保在引用变量时使用 $this->
  • 请确保为工作流中定义的每个变量指定 import/use
  • 您不能定义循环转换。(state1 -> state2 -> state3 -> state1)
  • 允许使用以下原始类型
    • 字符串
    • 布尔值
    • 整数
    • 浮点数

设置完定义文件后,运行以下命令生成代码

php artisan workflow:generate

将生成一个基 Workflow 类,所有其他工作流都从这个类扩展。

对于每个定义文件,它将生成一个 Base Class 以及一个扩展基类的类。您的工作定义文件的工作文件结构应如下所示

Workflows
  - Common
    - Workflow.php                      // This is the base workflow class that all base workflows extend from.
  - UserUpdate
    - Code
      - WorkflowUserUpdate.php          // The workflow class where your business logic will go. This extends the base class
    - Definition
      - UserUpdate.json                 // Definition file where you define everything
    - Generated
      - WorkflowUserUpdateBase.php      // The auto generated base class that extends Workflow.php
  - ...

许可证

Laravel 工作流生成器是开源软件,遵循 MIT 许可协议