tamkeen-tech / laravel-enum-state-machine
使用枚举控制状态
v1.1.0
2024-06-03 08:39 UTC
Requires
- php: ^8.0
- laravel/framework: ^9.0|^10.0
README
简介
此包简化了控制模型状态之间的转换,允许您防止不合理的转换,并使用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
的情况,允许的转换是 PAID
和 EXPIRED
,账单的初始状态必须是 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)。有关更多信息,请参阅 许可文件