linkbee / state-workflow
Laravel 的状态管理工作流,此包 fork 自 RingierIMU/state-workflow
2.0
2020-12-27 07:25 UTC
Requires
- php: >7.2.5
- illuminate/events: >7.0
- illuminate/support: >7.0
- symfony/event-dispatcher: ^5.1
- symfony/property-access: ^5.1
- symfony/workflow: ^5.1
Requires (Dev)
- funkjedi/composer-include-files: ^1.0
- mockery/mockery: ^1.3
- orchestra/database: 5.*
- orchestra/testbench: 5.*
- phpunit/phpunit: ^8.0
This package is auto-updated.
Last update: 2024-09-27 16:55:29 UTC
README
在 Laravel 中实现 Symfony Workflow 组件
工作流由状态和动作组成,动作被称为转换,描述了如何从一个状态转换到另一个状态。
安装
$ composer require linkbee/state-workflow
对于低于 5.5 的 Laravel 版本,运行上述脚本后此步骤很重要。
- 打开你的 config/app.php 文件并添加自定义服务提供者
Linkbee\StateWorkflow\StateWorkflowServiceProvider::class
发布 config/workflow.php
文件
$ php artisan vendor:publish --provider="Linkbee\StateWorkflow\StateWorkflowServiceProvider"
运行迁移
$ php artisan migrate
配置
- 打开
config/workflow.php
并进行配置
// this should be your model name in camelcase. eg. PropertyListing::Class => propertyListing 'post' => [ // class of your domain object 'class' => \App\Post::class, // Register subscriber for this workflow which contains business rules. Uncomment line below to register subscriber //'subscriber' => \App\Listeners\UserEventSubscriber::class, // property of your object holding the actual state (default is "current_state") //'property_path' => 'current_state', //uncomment this line to override default value // list of all possible states 'states' => [ 'new', 'pending_activation', 'activated', 'deleted', 'blocked' ], // list of all possible transitions 'transitions' => [ 'create' => [ 'from' => ['new'], 'to' => 'pending_activation', ], 'activate' => [ 'from' => ['pending_activation'], 'to' => 'activated', ], 'block' => [ 'from' => ['pending_activation', 'activated'], 'to' => 'blocked' ], 'delete' => [ 'from' => ['pending_activation', 'activated', 'blocked'], 'to' => 'deleted', ], ], ],
- 将
HasWorkflowTrait
添加到你的模型类以支持工作流
<?php namespace App; use Illuminate\Database\Eloquent\Model; use Linkbee\StateWorkflow\Traits\HasWorkflowTrait; /** * Class Post * @package App */ class Post extends Model { use HasWorkflowTrait; }
用法
管理状态/工作流
<?php use App\Post; $post = new Post(); //Apply transition $post->applyTransition("create"); $post = $post->refresh(); //Return current_state value $post->state(); //pending_activation //Check if this transition is allowed $post->canTransition("activate"); // True //Return Model state history $post->stateHistory();
触发事件
每个步骤都会依次触发三个事件
- 每个工作流的事件
- 相关工作流的事件
- 与特定转换或状态名称相关的工作流事件
在状态/工作流转换期间,以下事件按以下顺序触发
- 验证转换是否完全允许。它们的监听器在每次调用
workflow()->can()
、workflow()->apply()
或workflow()->getEnabledTransitions()
时被调用。Guard Event
workflow.guard workflow.[workflow name].guard workflow.[workflow name].guard.[transition name]
- 主题即将离开一个状态。
Leave Event
workflow.leave workflow.[workflow name].leave workflow.[workflow name].leave.[state name]
- 主题正在经历这个转换。
Transition Event
workflow.transition workflow.[workflow name].transition workflow.[workflow name].transition.[transition name]
- 主题即将进入新的状态。此事件在主题状态更新之前触发。
Enter Event
workflow.enter workflow.[workflow name].enter workflow.[workflow name].enter.[state name]
- 主题已进入状态并更新。
Entered Event
workflow.entered workflow.[workflow name].entered workflow.[workflow name].entered.[state name]
- 主题已完成此转换。
Completed Event
workflow.completed workflow.[workflow name].completed workflow.[workflow name].completed.[transition name]
订阅者
创建订阅者类以监听这些事件,并且该类应该 extends WorkflowSubscriberHandler
。
要注册订阅者中特定事件的监听方法,请使用以下格式的方法名称
- on[Event] -
onGuard()
- on[Event][Transition/State name] -
onGuardActivate()
注意
- 方法名称必须以
on
关键字开头,否则将被忽略。 Subscriber
类必须在workflow.php
配置文件中注册,并带有适当的配置。Subscriber
类必须扩展WorkflowSubscriberHandler
。Guard
、Transition
和Completed
事件使用转换名称。Leave
、Enter
和Entered
事件使用状态名称。
<?php namespace App\Listeners; use Linkbee\StateWorkflow\Events\EnteredEvent; use Linkbee\StateWorkflow\Events\EnterEvent; use Linkbee\StateWorkflow\Events\GuardEvent; use Linkbee\StateWorkflow\Events\LeaveEvent; use Linkbee\StateWorkflow\Events\TransitionEvent; use Linkbee\StateWorkflow\Subscribers\WorkflowSubscriberHandler; /** * Class PostEventSubscriber * @package App\Listeners */ class UserEventSubscriber extends WorkflowSubscriberHandler { /** * Handle workflow guard events. * * @param GuardEvent $event */ public function onGuardActivate($event) { $user = $event->getOriginalEvent()->getSubject(); if (empty($user->dob)) { // Users with no dob should not be allowed $event->getOriginalEvent()->setBlocked(true); } } /** * Handle workflow leave event. * * @param LeaveEvent $event */ public function onLeavePendingActivation($event) { } /** * Handle workflow transition event. * * @param TransitionEvent $event */ public function onTransitionActivate($event) { } /** * Handle workflow enter event. * * @param EnterEvent $event */ public function onEnterActivated($event) { } /** * Handle workflow entered event. * * @param EnteredEvent $event */ public function onEnteredActivated($event) { } }
事件方法
每个工作流事件都有一个 Event
实例。这意味着每个事件都可以访问以下信息
getOriginalEvent()
:返回触发事件的父事件,该事件具有以下子方法getSubject()
:返回触发事件的对象。getTransition()
:返回触发事件的转换。getWorkflowName()
:返回触发事件的触发工作流名称的字符串。isBlocked()
:如果转换被阻止,返回 true/false。setBlocked()
:设置阻止值。
Artisan 命令
Symfony 工作流使用 GraphvizDumper 通过使用 dot
命令来创建工作流图像。该 dot
命令是 Graphviz 的一部分。
您需要下载 dot
命令才能使用此命令。https://graphviz.gitlab.io/download/
用法
php artisan workflow:dump workflow_name