cerbero/workflow

利用管道的力量创建可扩展和维护的应用程序。

4.1.1 2016-02-29 04:59 UTC

This package is auto-updated.

Last update: 2024-09-04 22:19:35 UTC


README

工作流程

Build Status Latest Stable Version License Code Climate Scrutinizer Gratipay

SensioLabsInsight

假设我们想要开发一个注册流程,主要任务是存储用户数据,但我们还想要验证输入、哈希密码并发送欢迎邮件。

现在想象这个流程就像同心圆:存储用户数据是内圈,而验证、哈希、发送邮件和其他逻辑则是逐渐向外扩展的圈。

这样的同心圆或管道可以在管道中同时调用,并具有许多优点,包括在给定命令之前或之后运行特定代码,以及添加/删除任何逻辑而无需触摸控制器。

这使您可以只使用几行代码(通常是两行)来拥有所有控制器,同时保留所有功能。

此软件包旨在通过使用简单的 Artisan 命令来自动化此类管道的创建,并提供了其他功能,如自动验证、在单个文件中管理管道以及在其控制台中可视化它们的图形表示。

注意:如果您正在使用 Laravel 4,请查看利用装饰器设计模式的 此版本

安装

在您的应用程序根目录中运行此命令

composer require cerbero/workflow

并将以下字符串添加到 config/app.php 中的 providers 数组

'Cerbero\Workflow\WorkflowServiceProvider',

配置

默认情况下,所有生成的流程都放置在 app/Workflows 中。您可以通过运行以下命令来更改它

php artisan vendor:publish

然后编辑 config/workflow.php 文件。

创建工作流程

以介绍性示例为例,让我们通过运行以下命令创建注册工作流程

php artisan workflow:create RegisterUser --attach="hash notify"

以下文件将在 app 目录下自动创建

更新

从 v3.1 版本开始,您还可以将路由参数映射到命令构造函数

虽然 命令请求 都有很好的文档,但让我们看一下新创建的管道之一,比如说 Hash.php

该类有两个方法:`before()` 在处理传递给 `RegisterUserCommand` 作为参数之前运行,而 `after()` 在处理命令之后运行,并且也具有处理命令返回的值作为参数,例如用户模型。

您可以在两个方法中注入您需要的任何内容,所有内容都由服务容器自动解析。此外,如果您不需要 `before()` 或 `after()`,您可以安全地删除未使用的方法。

所有工作流程都存储在 workflows.yml 文件中,这使得读取和更新管道及其管道更加容易,即使您将看到,也有 Artisan 命令来自动化这些任务。

如您所注意到的,您只创建了 Hash 和 Notify,但没有验证数据。每个工作流程都会自动验证输入,通过从生成的请求中读取验证规则和权限,例如 RegisterUserRequest

然而,有时您可能没有要验证的输入,在这些情况下,您可以使用 `--unguard` 标志来避免创建请求类。

php artisan workflow:create TakeItEasy --unguard

以下是 `workflow:create` 选项的概述

读取工作流程

为了更好地理解特定管道的工作流程,您可以运行以下命令

php artisan workflow:read RegisterUser

它将输出类似的内容

             ║
╔════════════╬════════════╗
║       Hash ║ before()   ║
║ ╔══════════╬══════════╗ ║
║ ║   Notify ║ before() ║ ║
║ ║ ╔════════╩════════╗ ║ ║
║ ║ ║  RegisterUser   ║ ║ ║
║ ║ ╚════════╦════════╝ ║ ║
║ ║   Notify ║ after()  ║ ║
║ ╚══════════╬══════════╝ ║
║       Hash ║ after()    ║
╚════════════╬════════════╝
             ∇

图中中间的箭头显示了代码在管道内部的行程。请注意,Hash管道包裹了Notify管道,而Notify管道又包裹了RegisterUser命令,以及管道方法分别在命令前后执行的情况。

用法

现在您已经创建了注册工作流程并了解了其理论上的工作原理,是时候看到它的实际运行了。

有多种方式来运行工作流程。为了使所有控制器在解析后都具有$workflow属性,请按照以下方式编辑app/Http/Controllers/Controller.php

use Cerbero\Workflow\RunsWorkflow;
use Cerbero\Workflow\WorkflowRunner;

abstract class Controller extends BaseController implements WorkflowRunner {

	use RunsWorkflow;

}

现在您可以通过每个控制器中可用的$workflow属性来运行您的流程

public function store()
{
	$this->workflow->registerUser();
}

否则,如果您只想在部分控制器(甚至非控制器)中运行工作流程,您可以对Cerbero\Workflow\Workflow类进行类型提示

use Cerbero\Workflow\Workflow;

class RegisterController extends Controller {

	public function __construct(Workflow $workflow)
	{
		$this->workflow = $workflow;
	}

	public function store()
	{
		$this->workflow->registerUser();
	}

}

最后,您可以使用在安装过程中自动注册的Workflow外观

public function store()
{
	\Workflow::registerUser();
}

您可以在这里看到工作演示。

更新工作流程

使用管道的最大优点之一是您可以轻松地添加和删除功能,同时保持其余代码的完整性。

Artisan命令workflow:update可以将管道附加到现有管道或从现有管道中分离出来

php artisan workflow:update RegisterUser --attach="upload log" --detach="notify"

默认情况下,分离的管道不会被删除。如果您需要,可以使用--force标志

php artisan workflow:update RegisterUser --detach="notify" --force

有时您可能想要对附加的管道进行排序,以便在给定的管道中引入或输出,您可以通过编辑workflows.yml文件来实现。它包含所有创建的管道及其自己的管道,从外部(第一个运行)到内部排序。

以下是workflow:update选项的总结

删除工作流程

要删除整个管道,您可以运行

php artisan workflow:delete RegisterUser

与更新命令类似,默认情况下不会删除分离的管道,再次可以使用--force标志

php artisan workflow:delete RegisterUser --force