bidzm/eloquent-state-machine

1.0.5 2018-02-17 12:14 UTC

This package is not auto-updated.

Last update: 2024-09-15 04:36:42 UTC


README

Eloquent 状态机

通过 Composer 安装

composer require bidzm/eloquent-state-machine

用法

只需将 Bidzm\StateMachine 添加到您的 eloquent 模型中。

namespace App;

use Illuminate\Database\Eloquent\Model;
use Bidzm\StateMachine;

class Message extends Model
{
    use StateMachine;
    protected $fieldState = 'state'; // attribute name that use as state. Default `state`;
    protected $initialState = 'initiated'; // initial state. Default `initiated`;
    protected $transitions = [
        [
            'from' => ['initiated'], // Previous state
            'to' => 'queued', // State name
            'on' => 'queue' // Action name
        ],
        [
            'from' => ['queued'], // Previous state
            'to' => 'finished', // State name
            'on' => 'finish' // Action name
        ],
    ];
}

有一些您可以使用的功能

<?php

$message = new App\Message();
$message->save();
$message->state; // `initiated`

$message->can('queue'); // `true`
// `canQueued` method on your model where `Queued` is the "studly" cased name of the state you want check
$message->canQueued(); // `true`
$message->canFinished(); // `false`

$message->isState('initiated'); // `true`
// `isInitiated` method on your model where `Initiated` is the "studly" cased name of the state you want check
$message->isInitiated(); // `true`
$message->isFinished(); // `false`

$message->queue();
$message->state; // `queued`

如果您想在状态转换触发前或后执行某些操作,您必须重写方法 beforeTransition()afterTransition()

<?php

public function beforeTransition($from, $to)
{
    // do something
}

public function afterTransition($from, $to)
{
    // do something
}

状态变更时间

您可以使用属性 state_change_at 在您的表中存储状态变更的时间

namespace App;

use Illuminate\Database\Eloquent\Model;
use Bidzm\StateMachine;

class Message extends Model
{
    use StateMachine;
    protected $fieldState = 'state'; // Attribute name that use as state. Default `state`;
    protected $initialState = 'initiated'; // Initial state. Default `initiated`;
    protected $useChangeAt = true; // Determine if store time when state changed. Default false;
    protected $transitions = [
        [
            'from' => ['initiated'], // Previous state
            'to' => 'queued', // State name
            'on' => 'queue' // Name action
        ],
    ];
}

有一些您可以使用的功能

<?php

$message = new App\Message();
$message->save();
$message->state; // `initiated`
$message->initiatedAt(); // 2017-08-19T21:07:00+07:00

$message->queue();
$message->state; // `queued`
$message->initiatedAt(); // 2017-08-19T21:07:00+07:00
$message->queuedAt(); // 2017-08-19T21:07:01+07:00

许可证

MIT - https://open-source.org.cn/licenses/MIT