dcodegroup/laravel-state-machines

为Laravel生成状态机类

1.0.3 2024-03-04 09:41 UTC

This package is auto-updated.

Last update: 2024-08-28 03:12:17 UTC


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()方法来更改您模型的状态。