dcodegroup / laravel-state-machines
为Laravel生成状态机类
1.0.3
2024-03-04 09:41 UTC
Requires
- php: ^8.2
- illuminate/console: ^10.0
- illuminate/database: ^10.0
- illuminate/support: ^10.0
README
这个Laravel包简化了为您的模型创建状态机的流程,灵感来源于Jake Bennett在2023年Laracon US Nashville会议上的演讲[观看演讲]。
功能
- 数据库迁移,用于管理状态和跟踪状态历史。
- Artisan命令,可轻松生成带有状态和转换的状态机,适用于指定的模型。
安装与设置
您可以通过composer安装此包
composer require dcodegroup/laravel-state-machines
您可以通过Artisan命令发布状态和状态可迁移的文件
php artisan vendor:publish --tag=statuses-migrations
此命令允许您根据具体需求自定义和调整迁移。
创建状态机
运行php artisan make:state-machine
命令以创建您的第一个状态机。该命令接受一个模型作为参数,状态和转换作为选项。
php artisan make:state-machine User --states=Accepted,Pending,Rejected --transitions=approve,deny
以下示例将在App/StateMachines/User
目录下生成以下状态机
- UserStateContract.php,其中所有转换都是方法。
- BaseUserState.php,实现了UserStateContract并在每个转换上自动抛出异常。
- AcceptedState.php, PendingState.php, RejectedState.php,它们扩展了BaseUserState。
您还可以使用--namespace
选项更改模型的默认命名空间,如果它们不在App/Models
下存储。例如:--namespace=App\\ACL
。
在模型上配置状态。
将HasStates
特质添加到您的模型中,并添加一个status_id
列到同一模型中。在您的模型中实现状态方法,使其返回用户状态合约。
use App\StateMachines\Users\AcceptedState; use App\StateMachines\Users\PendingState; use App\StateMachines\Users\RejectedState; use http\Exception\InvalidArgumentException; public function state() { return match($this->status->machine_name) { 'accepted' => new AcceptedState($this), 'pending' => new PendingState($this), 'rejected' => new RejectedState($this), 'default' => throw new InvalidArgumentException('Invalid state'), } }
使用状态
从您的模型中调用状态方法,并通过转换方法进行链式调用。例如:
$user->state()->approve();
默认模型状态
您可以通过覆盖在HasStates
特质中定义的$defaultState
属性来在您的模型上设置默认状态。
分配状态
您可以使用接受状态机名称作为参数的setStatus()
方法来更改您模型的状态。