bogordesaincom/laravel-enum-simple

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

v3.1 2024-03-02 15:14 UTC

This package is auto-updated.

Last update: 2024-10-01 00:09:07 UTC


README

Stand With Ukraine

优雅的 Laravel 枚举实现

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

源自 Mad Web Laravel Enum

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

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

功能

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

简单的枚举示例

namespace App\Enums;

use Bogordesain\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

返回 Enum 的验证规则类实例

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)。请参阅许可证文件以获取更多信息。