istvan0304 / laravel-workflow
Laravel工作流引擎。
1.4.0
2023-02-16 08:55 UTC
Requires
- php: >=7.4
README
安装
composer require istvan0304/laravel-workflow
配置
将工作流行为附加到你的模型中。
use Istvan0304\Workflow\WorkflowTrait;
class BlogPost extends Model
{
use WorkflowTrait;
/**
* @var string
*/
protected string $workflowClass = BlogPostWorkflow::class;
默认工作流属性是 "status",但你可以像在模型中这样覆盖它:
protected string $customWorkflowStatusAttribute = 'state';
向EventServiceProvider添加观察者
protected $observers = [
BlogPost::class => [\Istvan0304\Workflow\Observers\WorkflowObserver::class],
];
创建一个工作流
工作流被定义为实现Istvan0304\Workflow\WorkflowDefinition接口的PHP类,该接口声明了三个函数
- statusLabels() // 此方法必须返回一个表示工作流状态名称的数组。
- statusActionLabels() // 此方法必须返回一个表示工作流状态操作名称的数组。
- getDefinition() // 此方法必须返回一个表示工作流定义的数组。
示例工作流类
namespace App\Models;
use Illuminate\Support\Facades\Auth;
use Istvan0304\Workflow\WorkflowDefinition;
class BlogPostWorkflow implements WorkflowDefinition
{
const DRAFT = 'draft';
const DELETED = 'deleted';
const FINAL = 'final';
const REJECT = 'reject';
const FIX = 'fix';
const PUBLISHED = 'published';
/**
* @return string[]
*/
public static function statusLabels(): array
{
return [
self::DRAFT => 'Draft',
self::DELETED => 'Deleted',
self::FINAL => 'Finalized',
self::REJECT => 'Rejected',
self::FIX => 'Returned for repair',
self::PUBLISHED => 'Published'
];
}
/**
* @return string[]
*/
public static function statusActionLabels(): array
{
return [
self::DRAFT => 'Draft',
self::DELETED => 'Delete',
self::FINAL => 'Finalization',
self::REJECT => 'Rejection',
self::FIX => 'Return for repair',
self::PUBLISHED => 'Publication'
];
}
/**
* @return array
*/
public static function getDefinition(): array
{
return [
'initialStatus' => self::DRAFT,
'status' => [
self::DRAFT => [
'transition' => [self::FINAL, self::DELETED],
// 'transition' => function(){
// return [self::REJECT, self::FIX];
// },
],
self::DELETED => [
'transition' => [],
],
self::FINAL => [
'transition' => (Auth::user()->hasRole('admin') ? [self::DELETED, self::REJECT, self::FIX, self::PUBLISHED] : [self::REJECT, self::FIX, self::PUBLISHED]),
],
self::REJECT => [
'transition' => [],
],
self::FIX => [
'transition' => [self::FINAL],
],
self::PUBLISHED => [
'transition' => [],
]
]
];
}
}
启动工作流
/**
* Create blog post
* @param Request $request
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|void
*/
public function createStore(Request $request)
{
$model = new BlogPost();
// ...
$model->start(); // Workflow start
$model->fill($attributes);
if ($model->save()) {
return redirect('/blog-posts')->with('message', 'Successfully saved!');
}
}
更改状态
/**
* @param Request $request
* @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|void
*/
public function updateStore(Request $request, $id)
{
$model = BlogPost::find($id);
// ...
if($request->final){
$model->sendToStatus(BlogPostWorkflow::FINAL); // Change status
}
// ...
}
如果两个状态之间没有过渡,你会得到一个异常。
许可
MIT许可(MIT)。请参阅许可文件以获取更多信息。