ysn/laravel-multi-workflows

此包允许您在内部创建多个工作流和管道

dev-master 2019-07-19 13:37 UTC

This package is auto-updated.

Last update: 2024-09-20 00:32:20 UTC


README

此包允许您为模型定义多个工作流。每个工作流可以有多个管道 > 步骤 > 转换

#安装

首先使用composer安装包

composer install ysn/LaravelMultiWorkflows

然后发布供应商以获取迁移

php artisan vendor:publish

最后执行迁移

php artisan migrate

#使用方法

首先创建一个与您的模型相关联的工作流类,以定义工作流如下

<?php
/**
 * Created by PhpStorm.
 * User: ysn
 * Date: 05/07/2019
 * Time: 20:02
 */

namespace App\Repositories;

use Illuminate\Support\Facades\Auth;
use Ysn\LaravelMultiWorkflows\Workflows\BaseWorkflow;
use Ysn\LaravelMultiWorkflows\Workflows\Pipeline;
use Ysn\LaravelMultiWorkflows\Workflows\Step;
use Ysn\LaravelMultiWorkflows\Workflows\Transition;

class EtablissementWorkflow extends BaseWorkflow
{

    private static $workflowClass;

    private static function defaultPipeline()
    {
        return array(new Pipeline('validationEtablissement'));
    }


    public function __construct($newArrayPipelines)
    {
        self::$workflowClass = get_class($this);

        // We create a pipeline
        if(empty($newArrayPipelines)){
            $newArrayPipelines = self::defaultPipeline();
        }

        // We add it to the workflow
        parent::__construct($newArrayPipelines);

        // We create the steps
        $stepNotValidated = new Step('notValidated','red','non validé',true);
        $stepValidated = new Step('validated','green','validé');
        // put the steps in an array
        $steps = array(
            $stepNotValidated,
            $stepValidated,
        );

        // We pass the array to the Pipeline class addSteps method
        $validationPipeline = parent::getPipeline('validationEtablissement');
        $validationPipeline->setSteps($steps);

        // we set the transitions
        $user = Auth::getUser();
        $transitionValidate = new Transition(
            'validate',
            $user->hasPermissionTo('validate_etablissement'),
            'Avoir le droit de valider un établissement',
            'validated',
            'EtablissementValidatedEvent');

        $transitionUnvalidate = new Transition(
            'unvalidate',
            true,
            'pas de condition particulière',
            'notValidated',
            'EtablissementUnvalid');

        //We add the transitions to the steps
        $stepNotValidated->addTransition($transitionValidate);
        $stepValidated->addTransition($transitionUnvalidate);

    }

    /**
     * @return string
     */
    public static function getWorkflowClass(): string
    {
        return self::$workflowClass;
    }

}

创建与您的转换相关联的事件。

现在您可以在控制器中使用您的工作流类

    // We call the workflow
    $instanceWorkflow = new EtablissementWorkflow(array());
    $pipeline = $instanceWorkflow->getPipeline('validationEtablissement');

    //get current step
    $currentStep = $instanceWorkflow->getCurrentStep(
        $instanceWorkflow::getWorkflowClass(),
        'App\Models\Etablissement',
        $etablissement->id,
        'validationEtablissement'
    );
    
    // apply a transition
    $instanceWorkflow->apply(string $transitionName,string $workflowClass,string $model,int $modelId,string $pipelineName);