webfox/laravel-backed-enums

增强你的PHP8后端枚举,支持本地化支持和流畅的比较方法等超级功能。

v2.3.1 2024-03-15 01:13 UTC

README

Banner Image

Latest Version on Packagist Total Downloads

此包通过超级功能如本地化支持和流畅的比较方法等增强你的PHP8后端枚举。

安装

composer require webfox/laravel-backed-enums

使用

设置你的枚举

你创建的枚举必须实现BackedEnum接口并使用IsBackedEnum特质。接口是Laravel正确转换枚举所必需的,而特质则赋予了枚举超级功能。

use Webfox\LaravelBackedEnums\BackedEnum;
use Webfox\LaravelBackedEnums\IsBackedEnum;

enum VolumeUnitEnum: string implements BackedEnum
{
    use IsBackedEnum;

    case MILLIGRAMS = "milligrams";
    case GRAMS = "grams";
    case KILOGRAMS = "kilograms";
    case TONNE = "tonne";
}

枚举值标签(本地化)

创建枚举.php语言文件并为枚举值创建标签。

// resources/lang/en/enums.php

return [
     VolumeUnitEnum::class => [
        VolumeUnitEnum::MILLIGRAMS->value => "mg",
        VolumeUnitEnum::GRAMS->value      => "g",
        VolumeUnitEnum::KILOGRAMS->value  => "kg",
        VolumeUnitEnum::TONNE->value      => "t"
     ]
];

然后你可以使用->label()::labelFor()方法访问这些本地化值。
此外,在blade模板中渲染枚举将显示标签。

VolumeUnitEnum::MILLIGRAMS->label(); // "mg"
VolumeUnitEnum::labelFor(VolumeUnitEnum::TONNE); // "t"
// in blade
{{ VolumeUnitEnum::KILOGRAMS }} // "kg"

如果你在语言文件中未指定标签,这些方法将返回枚举文件中分配给枚举的值。例如,MILLIGRAMS标签将是MILLIGRAMS。

元数据

添加元数据可以让你在标签和值旁边返回额外的值。

在你的枚举上创建一个withMeta方法以添加元数据。

public function withMeta(): array
{
    return match ($this) {
        self::MILLIGRAMS                => [
            'background_color' => 'bg-green-100',
            'text_color'       => 'text-green-800',
        ],
        self::GRAMS                     => [
            'background_color' => 'bg-red-100',
            'text_color'       => 'text-red-800',
        ],
        self::KILOGRAMS, self::TONNE    => [
            'background_color' => 'bg-gray-100',
            'text_color'       => 'text-gray-800',
        ],
        default                         => [
            'background_color' => 'bg-blue-100',
            'text_color'       => 'text-blue-800',
        ],
    };
}

如果你未指定withMeta方法,元数据将是一个空数组。

其他方法

options

返回一个包含所有枚举值及其标签和元数据的数组。

使用

VolumeUnitEnum::options();

返回值

[
    [
        'name'  => 'MILLIGRAMS'
        'value' => 'milligrams',
        'label' => 'mg',
        'meta'  => [
            'background_color' => 'bg-green-100',
            'text_color'       => 'text-green-800',
        ],
    ],
    [
        'name'  => 'GRAMS',
        'value' => 'grams',
        'label' => 'g',
        'meta'  => [
            'background_color' => 'bg-red-100',
            'text_color'       => 'text-red-800',
        ],
        ...
    ]
]

names

返回一个包含所有枚举值的数组。

使用

VolumeUnitEnum::names();

返回值

[
    'MILLIGRAMS',
    'GRAMS',
    'KILOGRAMS',
    'TONNE',
]

values

返回一个包含所有枚举值的数组。

使用

VolumeUnitEnum::values();

返回值

[
    'milligrams',
    'grams',
    'killograms',
    'tonne',
]

labels

返回一个包含所有枚举标签的数组。

使用

VolumeUnitEnum::labels();

返回值

[
    'mg',
    'g',
    'kg',
    't',
]

map

返回一个将所有枚举值映射到其标签的数组。

使用

VolumeUnitEnum::map();

返回值

[
    'MILLIGRAMS' => 'mg',
    'GRAMS'      => 'g',
    'KILOGRAMS'  => 'kg',
    'TONNE'      => 't',
]

toArray

返回一个包含单个枚举值及其标签和元数据的数组。

使用

VolumeUnitEnum::MILLIGRAMS->toArray();

返回值

[
    'name'  => 'MILLIGRAMS'
    'value' => 'milligrams',
    'label' => 'mg',
    'meta'  => [
        'color'      => 'bg-green-100',
        'text_color' => 'text-green-800',
    ],
]

toHtml

::label()的别名。用于满足Laravel的Htmlable接口。

使用

VolumeUnitEnum::MILLIGRAMS->toHtml();

返回值

mg

toJson

返回一个表示toArray返回值的JSON字符串。

is/isA/isAn

允许你检查枚举是否是给定值。返回一个布尔值。

注意 isAisAnis的别名。

使用

VolumeUnitEnum::MILLIGRAMS->is(VolumeUnitEnum::MILLIGRAMS); //true
VolumeUnitEnum::MILLIGRAMS->is('MILLIGRAMS');               //true
VolumeUnitEnum::MILLIGRAMS->is('invalid');                  //exception

isNot/isNotA/isNotAn

允许你检查枚举是否不是给定值。返回一个布尔值。

注意 isNotAisNotAnisNot的别名。

使用

VolumeUnitEnum::MILLIGRAMS->isNot(VolumeUnitEnum::GRAMS); //true
VolumeUnitEnum::MILLIGRAMS->isNot('GRAMS');               //true
VolumeUnitEnum::MILLIGRAMS->isNot('invalid');             //exception

isAny

允许你检查枚举是否包含在数组中。返回一个布尔值。

使用

VolumeUnitEnum::MILLIGRAMS->isAny(['GRAMS', VolumeUnitEnum::TONNE]);                    // false
VolumeUnitEnum::MILLIGRAMS->isAny([VolumeUnitEnum::GRAMS, VolumeUnitEnum::MILLIGRAMS]); // true

isNotAny

允许你检查枚举是否不包含在数组中。返回一个布尔值。

使用

VolumeUnitEnum::MILLIGRAMS->isNotAny(['GRAMS', VolumeUnitEnum::TONNE]);                    // true
VolumeUnitEnum::MILLIGRAMS->isNotAny([VolumeUnitEnum::GRAMS, VolumeUnitEnum::MILLIGRAMS]); // false

rule

后端枚举可以使用Laravel的标准枚举验证规则进行验证 - new Illuminate\Validation\Rules\Enum(VolumeUnitEnum::class)
此方法为验证规则提供了快捷方式。

使用

public function rules(): array
{
    return [
        'volume_unit' => [VolumeUnitEnum::rule()],
    ];
}

其他类

AsFullEnumCollection

此转换类似于Laravel内置的AsEnumCollection转换,但与内置的不同,当转换为JSON时将保持完整的toArray结构。

例如,Laravel内置的AsEnumCollection转换将返回以下JSON

["MILLIGRAMS", "GRAMS"]

此转换将返回

[
  {
    "name": "MILLIGRAMS",
    "value": "MILLIGRAMS",
    "label": "mg",
    "meta": {
      "background_color": "bg-green-100",
      "text_color": "text-green-800"
    }
  },
  {
    "name": "GRAMS",
    "value": "GRAMS",
    "label": "g",
    "meta": {
      "background_color": "bg-red-100",
      "text_color": "text-red-800"
    }
  }
]

更新日志

有关最近更改的更多信息,请参阅更新日志

贡献

我们欢迎所有为项目做出贡献的贡献者。

许可协议

MIT许可协议(MIT)。有关更多信息,请参阅许可文件