cerbero / workflow
利用管道的力量创建可扩展和维护的应用程序。
Requires
- php: >=5.4.0
- illuminate/console: ~5.0
- illuminate/contracts: ~5.0
- illuminate/filesystem: ~5.0
- illuminate/support: ~5.0
- symfony/yaml: >=2.6
Requires (Dev)
README
工作流程
假设我们想要开发一个注册流程,主要任务是存储用户数据,但我们还想要验证输入、哈希密码并发送欢迎邮件。
现在想象这个流程就像同心圆:存储用户数据是内圈,而验证、哈希、发送邮件和其他逻辑则是逐渐向外扩展的圈。
这样的同心圆或管道可以在管道中同时调用,并具有许多优点,包括在给定命令之前或之后运行特定代码,以及添加/删除任何逻辑而无需触摸控制器。
这使您可以只使用几行代码(通常是两行)来拥有所有控制器,同时保留所有功能。
此软件包旨在通过使用简单的 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