jobmetric/laravel-state-machine

此包用于实现各种Laravel项目的Eloquent状态机。

1.1.1 2024-01-03 21:45 UTC

This package is auto-updated.

Last update: 2024-09-22 19:54:31 UTC


README

此包用于实现各种Laravel项目的Eloquent状态机。

使用composer安装

运行以下命令以获取最新版本

composer require jobmetric/laravel-state-machine

文档

当需要更改模型字段的“状态”,并且想要更改它后执行其他操作或更清楚地响应另一个“动作”时,可以使用此包。

用法

1. 假设你有一个具有“状态”字段的订单模型。

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;

class Order extends Model
{
    /**
     * @var array
     */
    protected $fillable = [
        'status',
    ];

    /**
     * @var array
     */
    protected $casts = [
        'status' => 'string',
    ];
}

2. 现在需要将名为“HasStateMachine”的特质添加到模型中。

<?php

namespace App\StateMachine;

use Illuminate\Database\Eloquent\Model;
use JobMetric\StateMachine\HasStateMachine;

class OrderStateMachine extends Model
{
    use HasStateMachine;
    
    ...
}

3. 当这个属性添加到模型中时,需要在模型中添加“StateMachineContract”接口。

<?php

namespace App\StateMachine;

use Illuminate\Database\Eloquent\Model;
use JobMetric\StateMachine\Contracts\StateMachineContract;
use JobMetric\StateMachine\HasStateMachine;

class OrderStateMachine extends Model implements StateMachineContract
{
    use HasStateMachine;
    
    ...
}

4. 现在再次需要在模型中使用“stateMachineAllowTransition”函数。

<?php

namespace App\StateMachine;

use Illuminate\Database\Eloquent\Model;
use JobMetric\StateMachine\Contracts\StateMachineContract;
use JobMetric\StateMachine\HasStateMachine;

class OrderStateMachine extends Model implements StateMachineContract
{
    use HasStateMachine;
    
    ...
    
    public function stateMachineAllowTransition(): void
    {
        $this->allowTransition('status', 'pending', 'processing');
        $this->allowTransition('status', 'processing', 'completed');
    }
}

注意:`stateMachineAllowTransition` 函数用于定义模型字段的“转换”。在上面的示例中,“状态”字段可以从“pending”转换为“processing”,再从“processing”转换为“completed”。

我们为什么这么做呢?

通过这样做,你正在定义状态想要移动到的状态。

从现在开始,不再允许手动操作状态。相反,必须使用StateMachine提供的函数在状态组件之间导航。它将处理更新过程和一系列其他任务,将在稍后进行详细说明。

$order = Order::find(1);

$order->status = 'processing';

$order->save();

注意:上面的代码将无法工作。因为“状态”字段只能从“pending”转换为“processing”,再从“processing”转换为“completed”。

如果你想要将“状态”字段从“pending”转换为“processing”,必须使用以下代码。

$order = Order::find(1);

$order->transitionTo('processing');

注意:如果它是除“状态”字段之外的字段,可以使用第二个参数指定该字段的名称。

让我们进入故事最精彩的部分

当发生“transitionTo”时,可以为此事件指定一个动作,如果存在,将自动执行。

让我们来看看动作

要定义“StateMachine”,必须执行以下方法

php artisan make:state-machine {model} {?state} -f={field}

模型:你想要为其创建“StateMachine”的模型的名称。

  • 该模型必须在系统中可用

状态:你想要为其创建“StateMachine”的状态的名称。

  • 这部分应该写成这样,例如 PendingToProcessing,并且“to”这个词必须位于两种情况之间。

  • 如果这部分留空,将创建一个名为“Common”的状态,将在下面进行解释。

字段:你想要为其创建“StateMachine”的字段的名称。

  • 这是状态字段的默认选项,如果你想要定义另一个字段,请使用此选项

当你运行此命令时,在 app/StateMachines 内部将创建一个文件

在创建的文件中,你有两个方法,before 和 after,这告诉你在更改数据库中的字段之前或之后执行操作。

在它们中,您可以使用不同的任务,例如发送电子邮件或许多其他事情。

常见文件和详细文件之间的区别

两个常见文件与待处理状态模式之间的区别,例如,在于它们的执行方式

common 文件对所有条件进行执行,但 确切状态 文件仅针对该特定模式进行执行,它们的执行形式如下

$common->before();
$exact->before();
// state change
$exact->after();
$common->after();

许可证

MIT 许可证 (MIT)。有关更多信息,请参阅 许可证文件