webfox/ laravel-backed-enums
增强你的PHP8后端枚举,支持本地化支持和流畅的比较方法等超级功能。
Requires
- php: ^8.1
- illuminate/contracts: ^10.0|^11.0
- spatie/laravel-package-tools: ^1.14.0
Requires (Dev)
- larastan/larastan: ^v2.9.2
- laravel/pint: ^1.0
- nunomaduro/collision: ^6.1
- orchestra/testbench: ^8.0
- pestphp/pest: ^1.21
- pestphp/pest-plugin-laravel: ^1.1
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- phpunit/phpunit: ^9.6
README
此包通过超级功能如本地化支持和流畅的比较方法等增强你的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
允许你检查枚举是否是给定值。返回一个布尔值。
注意
isA
和isAn
是is
的别名。
使用
VolumeUnitEnum::MILLIGRAMS->is(VolumeUnitEnum::MILLIGRAMS); //true VolumeUnitEnum::MILLIGRAMS->is('MILLIGRAMS'); //true VolumeUnitEnum::MILLIGRAMS->is('invalid'); //exception
isNot/isNotA/isNotAn
允许你检查枚举是否不是给定值。返回一个布尔值。
注意
isNotA
和isNotAn
是isNot
的别名。
使用
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)。有关更多信息,请参阅许可文件。