stanislavge/laravel-enum

Laravel的优雅枚举实现。使用make:enum命令,能够对Eloquent模型进行类型转换,并通过语言文件进行标签翻译。

dev-main 2024-07-24 11:12 UTC

This package is auto-updated.

Last update: 2024-09-24 11:33:36 UTC


README

Latest Version on Packagist Software License Build Status StyleCI Coverage Status Quality Score Total Downloads

基于MyCLabs PHP Enum,并实现了SplEnum接口。

您可以在PHP Enum Readme中找到基本功能的文档。

功能

  • make:enum命令
  • 能够对Eloquent模型的枚举字段进行类型转换
  • 通过语言文件进行标签翻译
  • 简单的验证规则

简单的枚举示例

namespace App\Enums;

use MadWeb\Enum\Enum;

/**
 * @method static PostStatusEnum FOO()
 * @method static PostStatusEnum BAR()
 * @method static PostStatusEnum BAZ()
 */
final class PostStatusEnum extends Enum
{
    const __default = self::PENDING;

    const PUBLISHED = 'published';
    const PENDING = 'pending';
    const DRAFT = 'draft';
}

安装

对于Laravel < 7版本 - 使用1.0分支

您可以通过composer安装此包

composer require mad-web/laravel-enum

使用

通过Artisan命令创建新的枚举类

php artisan make:enum PostStatusEnum

要填充枚举值,请将它们传递给name参数之后

php artisan make:enum PostStatusEnum DRAFT=draft PENDING=pending PUBLISHED=published

创建枚举类的实例

$status = new PostStatusEnum(PostStatusEnum::PENDING);

// or just use magic static method
$status = PostStatusEnum::PENDING();

枚举支持开箱即用的自定义转换功能。在$casts数组中指定枚举类以用于属性

class Post extends Model
{
    protected $fillable = ['title', 'status'];

    protected $casts = [
        'status' => PostStatusEnum::class,
    ];
}

之后,您可以使用枚举类来获取和设置枚举字段

$post = Post::first();

$status = $post->status; // PostStatusEnum

$post->status = PostStatusEnum::PENDING();

$post->save();

枚举值标签(本地化)

创建enums.php语言文件并声明枚举值的标签

// resources/lang/en/enums.php

return [
    PostStatusEnum::class => [
        PostStatusEnum::PENDING => 'Pending Label',
        PostStatusEnum::PUBLISHED => 'Published Label',
        PostStatusEnum::DRAFT => 'Draft Label',
    ],
];

并获取一个标签

PostStatusEnum::PENDING()->label(); // Pending Label

要覆盖默认的枚举语言文件路径,发布laravel-enum配置

php artisan vendor:publish --provider=MadWeb\\Enum\\EnumServiceProvider

并更改lang_file_path选项

// config/enum.php

return [
    'lang_file_path' => 'custom.path.to.enums',
];

验证规则

您可以使用EnumRule类或Enum::rule()方法通过请求验证枚举值。

public function store(Request $request)
{
    $this->validate($request, [
        'status' => ['required', new EnumRule(PostStatusEnum::class)],
    ]);

    // OR

    $this->validate($request, [
        'status' => ['required', PostStatusEnum::rule()],
    ]);
}

如果您想验证枚举键而不是枚举值,您可以指定您想验证的键而不是值。

public function store(Request $request)
{
    $this->validate($request, [
        'status' => ['required', new EnumRule(PostStatusEnum::class, true)],
    ]);

    // OR

    $this->validate($request, [
        'status' => ['required', PostStatusEnum::ruleByKey()],
    ]);
}

要自定义验证消息,请将enum键添加到验证语言文件中

// resources/lang/en/validation.php
return [
    //...
    'enum' => 'Custom validation message form enum attribute :attribute',
];

其他方法

getRandomKey(): string

返回枚举中的一个随机键。

PostStatusEnum::getRandomKey(); // Returns 'PUBLISHED` or `PENDING` or `DRAFT`

getRandomValue()

返回枚举中的一个随机值。

PostStatusEnum::getRandomValue(); // Returns 'published` or `pending` or `draft`

label(): string

返回枚举值对象的标签。

PostStatusEnum::PUBLISHED()->label(); // Returns 'published` or custom label declared in a lang file

labels(): array

返回枚举的所有标签。

PostStatusEnum::labels(); // Returns ['published`, 'pending', 'draft'] or array of custom labels declared in a lang file

is($value): bool

检查当前枚举值是否等于给定的枚举。

$status = PostStatusEnum::PENDING();


PostStatusEnum::PUBLISHED()->is($status); // false

PostStatusEnum::PENDING()->is($status); // true

// or

PostStatusEnum::PUBLISHED()->is($status->getValue()); // false

PostStatusEnum::PENDING()->is($status->getValue()); // true

// or check one of multiple values

$status->is([PostStatusEnum::DRAFT(), PostStatusEnum::PUBLISHED()]) // false

$status->is([PostStatusEnum::DRAFT(), PostStatusEnum::PENDING()]) // true

rule(): EnumRule

返回枚举的验证规则类实例。

PostStatusEnum::rule(); // new EnumRule(PostStatusEnum::class);

getConstList(bool $include_default = false): array

根据SplEnum::getConstList返回所有常量(可能的值)作为数组。

变更日志

请参阅CHANGELOG以获取有关最近更改的更多信息。

测试

composer test

贡献

请参阅CONTRIBUTINGCODE_OF_CONDUCT以获取详细信息。

鸣谢

许可证

MIT许可证(MIT)。请参阅许可证文件以获取更多信息。