istvan0304/laravel-workflow

Laravel工作流引擎。

1.4.0 2023-02-16 08:55 UTC

This package is auto-updated.

Last update: 2024-09-16 12:45:41 UTC


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)。请参阅许可文件以获取更多信息。