tamkeen-tech/laravel-enum-state-machine

v1.1.0 2024-06-03 08:39 UTC

This package is auto-updated.

Last update: 2024-09-03 09:08:00 UTC


README

Latest Version on Packagist Total Downloads

简介

此包简化了控制模型状态之间的转换,允许您防止不合理的转换,并使用PHP枚举控制模型的初始状态。每个枚举允许您在一个地方定义您的状态、允许的转换和初始状态。

Laravel Enum State Machine 还允许您自动记录每个定义的状态机的状态转换历史。

此包旨在帮助开发者以最少的努力实现其功能。

安装

您可以通过composer安装此包

composer require tamkeen-tech/laravel-enum-state-machine

接下来,如果您想记录历史

php artisan vendor:publish --tag=enum-state-machine-migrations

使用方法

假设您有一个具有状态的账单,因此您需要在账单模型中使用 HasStateMachines 特性,并定义您的 protected $stateMachines 数组变量,包括您将要应用状态机的所有字段,以及一个可选的布尔变量 protected $recordStateHistory,用于确定是否保存历史记录。

use TamkeenTech\LaravelEnumStateMachine\Traits\HasStateMachines;

class Bill extends Model
{
    use HasStateMachines;

    protected $fillable = [
        'status',
    ];

    protected $casts = [
        'status' => BillStatus::class,
    ];

    protected $recordStateHistory = true;

    protected $stateMachines = [
        'status'
    ];
}

在您的 BillStatus 类中,您需要使用特性 StateMachine 并添加两个方法 transitions 以定义您的转换数组以及 initialState 以定义允许的初始状态,两者都必须返回数组。

use TamkeenTech\LaravelEnumStateMachine\Traits\StateMachine;

enum BillStatus: string
{
    use StateMachine;

    case PENDING = 'PENDING';
    case PAID = 'PAID';
    case EXPIRED = 'EXPIRED';
    case REFUNDED = 'REFUNDED';

    public function transitions(): array
    {
        return match ($this) {
            self::PENDING => [self::PAID, self::EXPIRED],
            self::PAID => [self::REFUNDED]
        };
    }

    public function initialState(): array
    {
        return [self::PENDING];
    }
}

根据上述示例,对于 PENDING 的情况,允许的转换是 PAIDEXPIRED,账单的初始状态必须是 PENDING

现在您已经完成所有设置,您可以安全地编写代码。因此,如果您尝试创建具有不同初始状态的账单,您将收到异常。

示例

  • 创建具有不同初始状态的账单

    // throw InitailStateIsNotAllowedException with message "Only allowed initial states: PENDING"
    Bill::create([
      'status' => BillStatus::PAID
    ]);
  • 尝试更新到无效的转换

    $bill = Bill::create([
      'status' => BillStatus::PENDING
    ]);
    
    // throw StateTransitionNotAllowedException with message "Only allowed transition states: PAID, EXPIRED"
    $bill->update([
      'status' => BillStatus::REFUNDED
    ]);

变更日志

有关最近更改的详细信息,请参阅 CHANGELOG

贡献

有关详细信息,请参阅 CONTRIBUTING

安全

如果您发现任何与安全相关的问题,请通过电子邮件 theshreif@gmail.com 而不是使用问题跟踪器。

鸣谢

许可

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