open-southeners/laravel-model-status

一个非常简单但非常集成的Laravel状态包

2.1.0 2024-03-13 11:25 UTC

This package is auto-updated.

Last update: 2024-09-13 12:44:15 UTC


README

一个非常简单但非常集成的Laravel状态包(现在使用原生枚举,无需数据库)

入门

composer require open-southeners/laravel-model-status

创建状态枚举

假设你有一个Post模型,你应该创建一个类似下面的PostStatus枚举

use OpenSoutheners\LaravelModelStatus\ModelStatus;

enum PostStatus: int implements ModelStatus
{
    case Draft = 1;

    case Published = 2;

    case Hidden = 3;
}

现在请记住导入ModelStatus接口并在枚举中使用它。

设置你的模型

添加3件事:PHP的ModelStatuses属性,将Statusable接口实现到你的类中,并使用HasStatuses特质。

use OpenSoutheners\LaravelModelStatus\Attributes\ModelStatuses;
use OpenSoutheners\LaravelModelStatus\HasStatuses;
use OpenSoutheners\LaravelModelStatus\Statusable;

// Remember to replace PostStatus::class with whatever the enum you are using
// Also second option is a boolean that enable/disable events
#[ModelStatuses(PostStatus::class, true)]
class Post extends Model implements Statusable
{
    use HasStatuses;
}

可用方法

setStatus

$post = new Post();

// Set status to post instance
$post->setStatus(PostStatus::Published);

// Set status to post instance and persist to DB
$post->setStatus(PostStatus::Published, true);

setStatusWhen

// Set status to post instance only when current status is "Draft"
$post->setStatusWhen(PostStatus::Draft, PostStatus::Published);

// Set status to post instance and persist to DB only when current status is "Draft"
$post->setStatusWhen(PostStatus::Draft, PostStatus::Published, true);

hasStatus

// Check current status is "Published"
$post->hasStatus(PostStatus::Published);

// Check current status is "Published" as string (type sensitive)
$post->hasStatus('Published');

withoutStatusEvents

// Whenever you save the model updates and don't want to trigger events
Post::withoutStatusEvents(fn () => $post->setStatus(PostStatus::Published));

模型事件

目前这个包提供了一个OpenSoutheners\LaravelModelStatus\Events\StatusSwapped事件,你可以使用它来获取使用setStatusWhen方法执行的更改。