laravel-israel/eloquent-status-mutator

Eloquent 模型状态管理特性

0.1 2017-10-05 08:56 UTC

This package is not auto-updated.

Last update: 2024-09-29 04:03:29 UTC


README

Build Status Latest Stable Version Total Downloads License

处理模型的状态变化总是很痛苦。

Eloquent 状态转换器提供了一个简单的特性,强制执行正确的状态变化和一些更多酷炫的功能。

使用方法

定义状态

在模型的 statuses 属性中定义模型的状态

class Order extends Model
{
    use HasStatus;
    
    protected $statuses = [
        'opened'    => [],
        'paid'      => ['from'     => 'opened'],
        'approved'  => ['from'     => 'paid'],
        'shipped'   => ['from'     => ['paid', 'approved']],
        'arrived'   => ['from'     => 'shipped'],
        'cancelled' => ['not-from' => ['arrived']],
    ];
}

自动状态强制

该包确保只能设置列表中的状态

$order->status = 'opened'; // OK

$order->status = 'some other status'; // Throws Exception

状态流验证

该包强制状态只能在定义的状态的 'from' 键之后设置

$order->status = 'opened';

$order->status = 'paid'; // OK

$order->status = 'arrived'; // Throws Exception

该包还强制执行 'not-from' 状态

$order->status = 'arrived';

$order->status = 'cancelled'; // Throws Exception

辅助函数

$order->status = 'paid';

if ($order->is('paid')) {
    echo 'The order is shipped';
}

if ($order->canBe('shipped')) {
    echo 'The order can be shipped';
}

前后回调

在某些情况下,我们需要在设置特定状态后执行某些操作 - 例如,在订单取消后发送邮件。我们的包通过 on + 状态名称(驼峰命名法) 的约定在状态变化后调用方法

class Order extends Model
{
    use HasStatus;
    
    protected $statuses = [
        'opened'    => [],
        'paid'      => ['from'     => 'opened'],
        'approved'  => ['from'     => 'paid'],
        'shipped'   => ['from'     => ['paid', 'approved']],
        'arrived'   => ['from'     => 'shipped'],
        'cancelled' => ['not-from' => ['arrived']],
    ];
    
    public function onCancelled()
    {
        // Send cancellation mail to the user
    }
}

安装

  • 使用 composer 请求此包
composer require laravel-israel/eloquent-status-mutator
  • 在您的模型中使用 HasStatus 特性
class Order extends Model
{
    use HasStatus;
}
  • 在模型中定义可用的状态
protected $statuses = [
    'opened'    => [],
    'paid'      => ['from'     => 'opened'],
    'approved'  => ['from'     => 'paid'],
    'shipped'   => ['from'     => ['paid', 'approved']],
    'arrived'   => ['from'     => 'shipped'],
    'cancelled' => ['not-from' => ['arrived']],
];