bogordesain/lumen-enum

为 Lumen 提供优雅的 Enum 实现。通过 make:enum 命令,可以为 Eloquent 模型进行类型转换,并通过语言文件进行标签翻译。

dev-master 2024-08-18 15:15 UTC

This package is auto-updated.

Last update: 2024-09-18 15:27:40 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 模型的枚举字段进行类型转换
  • 通过语言文件进行标签翻译
  • 简单的验证规则

本包 Fork 自 Mad Web Enum

简单的 Enum 示例

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 命令创建新的 Enum 类

php artisan make:enum PostStatusEnum

要填充 Enum 的自定义值,请将其传递给 name 参数之后

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

创建 Enum 类的实例

$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 了解详细信息。

安全

如果您发现任何安全相关的问题,请通过电子邮件 madweb.dev@gmail.com 而不是使用问题跟踪器。

致谢

许可证

MIT 许可证 (MIT)。请参阅 许可证文件 了解更多信息。