jobmetric / laravel-state-machine
此包用于实现各种Laravel项目的Eloquent状态机。
Requires
- php: >=8.0.1
- ext-json: *
- laravel/framework: >=9.19
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)。有关更多信息,请参阅 许可证文件。