iteks / laravel-enum
一个全面的Laravel包,提供增强的枚举功能,包括属性处理、选择数组转换以及流畅的界面访问,以实现Laravel应用程序中强大的枚举管理。
Requires
- php: ^8.1
- laravel/framework: ^9.46|^10.10|^11.0
Requires (Dev)
- laravel/pint: ^1.14
- pestphp/pest: ^2.34
- pestphp/pest-plugin-arch: ^2.7
- phpstan/phpstan: ^1.10
- symfony/var-dumper: ^6.4
This package is auto-updated.
Last update: 2024-09-17 12:31:11 UTC
README
Laravel Enum包丰富了Laravel的枚举支持,集成了高级功能,如属性处理、选择数组转换和界面访问,以实现流畅的枚举操作。专为Laravel应用程序设计,它提供了一套工具,用于支持后端枚举和属性增强枚举,包括描述性注释、ID管理、标签生成和元数据关联。通过提供直观的流畅接口,该包简化了Laravel中枚举的工作,增强了表单、API响应等方面的枚举可用性。无论您是在定义选择选项、查询枚举属性还是将枚举与Laravel功能紧密集成,Laravel Enum都简化了这些过程,使Laravel应用程序中的枚举管理既强大又高效。由iteks提供,由jeramyhing开发。
开始使用
需要PHP 8.1+
通过Composer包管理器安装Laravel Enum
composer require iteks/laravel-enum
用法
EnumExample类
Laravel Enum方法是为PHP 8后端枚举类设计的。
Laravel Enum助手和特性方法扩展了现有的后端枚举类,以实现更灵活的枚举处理。此外,Laravel Enum还提供了一种流畅的方式,用于在支持后端枚举的枚举情况下添加和管理PHP 8属性。该包提供了四个可用的属性,可以轻松分配给您的枚举情况:描述、Id、标签和元数据。下面的ExampleEnum类演示了如何将这些属性应用到枚举中。您可以选择使用哪些属性。
use Iteks\Attributes\Description; use Iteks\Attributes\Id; use Iteks\Attributes\Label; use Iteks\Attributes\Metadata; use Iteks\Traits\BackedEnum; use Iteks\Traits\HasAttributes; enum ExampleEnum: int { use BackedEnum; use HasAttributes; #[Description('Lorem ipsum dolor sit amet, consectetur adipiscing elit.')] #[Id(0)] #[Label('First-Example')] #[Metadata(['key' => 'value'])] case FirstExample = 1; #[Description('Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.')] #[Id(1)] #[Label('SecondExample (Example)')] #[Metadata('{"key": "value"}')] case SecondExample = 2; #[Description('Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.')] #[Id(2)] #[Label('3rd Eg.')] #[Metadata([])] case ThirdExample = 3; }
枚举助手(BackedEnum)
首先,导入助手类
use Iteks\Support\Facades\Enum;
注意:此组助手不需要将任何特性应用于目标枚举类。您可以直接使用以下方法
Enum::asSelectArray()
获取后端枚举类作为数组以填充选择元素。数组将包含一个text
键列,包含显示格式的案例名称值,以及一个value
键列,包含原始的更简单的值。
注意:该方法首先会检查目标枚举类应用了哪些 标签 和 Id 属性。如果存在,则优先使用这些值。如果不存在,则从case名称返回一个变体的标题值。
Enum::asSelectArray(ExampleEnum::class);
array:3 [▼ 0 => array:2 [▼ "text" => "First-Example" "value" => 1 ] 1 => array:2 [▼ "text" => "SecondExample (Example)" "value" => 2 ] 2 => array:2 [▼ "text" => "3rd Eg." "value" => 3 ] ]
Enum::toLabel()
从case名称创建一个标签。
Enum::toLabel(ExampleEnum::FirstExample);
"First Example"
Enum::toLabels()
从case名称创建并编译标签数组。
Enum::toLabels(ExampleEnum::class);
array:3 [▼ 0 => "First Example" 1 => "Second Example" 2 => "Third Example" ]
枚举助手(HasAttributes)
首先,确保目标枚举类应用了 HasAttributes
特性,如上例中的 ExampleEnum 类 所示。
然后,导入辅助类
use Iteks\Support\Facades\Enum;
您可以使用以下方法
Enum::attributes()
检索所有case的所有属性。
Enum::attributes(ExampleEnum::FirstExample);
array:5 [▼ "simpleValue" => 1 "description" => "Lorem ipsum dolor sit amet, consectetur adipiscing elit." "id" => 0 "label" => "First-Example" "metadata" => array:1 [▼ "key" => "value" ] ]
Enum::attributes(ExampleEnum::FirstExample, ['id', 'label']);
array:2 [▼ "id" => 0 "label" => "First-Example" ]
Enum::attributes(ExampleEnum::class);
array:3 [▼ "FirstExample" => array:5 [▼ "simpleValue" => 1 "description" => "Lorem ipsum dolor sit amet, consectetur adipiscing elit." "id" => 0 "label" => "First-Example" "metadata" => array:1 [▼ "key" => "value" ] ] "SecondExample" => array:5 [▼ "simpleValue" => 2 "description" => "Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." "id" => 1 "label" => "SecondExample (Example)" "metadata" => "{"key": "value"}" ] "ThirdExample" => array:5 [▼ "simpleValue" => 3 "description" => "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat." "id" => 2 "label" => "3rd Eg." "metadata" => [] ] ]
Enum::attributes(ExampleEnum::class, ['description', 'metadata']);
array:3 [▼ "FirstExample" => array:2 [▼ "description" => "Lorem ipsum dolor sit amet, consectetur adipiscing elit." "metadata" => array:1 [▼ "key" => "value" ] ] "SecondExample" => array:2 [▼ "description" => "Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." "metadata" => "{"key": "value"}" ] "ThirdExample" => array:2 [▼ "description" => "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat." "metadata" => [] ] ]
Enum::description()
检索描述属性。
Enum::description(ExampleEnum::FirstExample);
"Lorem ipsum dolor sit amet, consectetur adipiscing elit."
Enum::descriptions()
检索所有case的描述属性。
Enum::descriptions(ExampleEnum::class);
array:3 [▼ 0 => "Lorem ipsum dolor sit amet, consectetur adipiscing elit." 1 => "Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." 2 => "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat." ]
Enum::id()
检索id属性。
Enum::id(ExampleEnum::FirstExample);
0
Enum::ids()
检索所有case的id属性。
Enum::ids(ExampleEnum::class);
array:3 [▼ 0 => 0 1 => 1 2 => 2 ]
Enum::label()
检索标签属性。
Enum::label(ExampleEnum::FirstExample);
"First-Example"
Enum::labels()
检索所有case的标签属性。
Enum::labels(ExampleEnum::class);
array:3 [▼ 0 => "First-Example" 1 => "SecondExample (Example)" 2 => "3rd Eg." ]
Enum::metadata()
检索元数据属性。
Enum::metadata(ExampleEnum::FirstExample);
array:1 [▼ "key" => "value" ]
Enum::metadatum()
检索所有case的元数据属性。
Enum::metadatum(ExampleEnum::class);
array:3 [▼ 0 => array:1 [▼ "key" => "value" ] 1 => "{"key": "value"}" 2 => [] ]
枚举特性(BackedEnum)
首先,确保目标枚举类应用了 BackedEnum
特性,如上例中的 ExampleEnum 类 所示。
然后,您可以使用以下方法
asSelectArray()
获取后端枚举类作为数组以填充选择元素。数组将包含一个text
键列,包含显示格式的案例名称值,以及一个value
键列,包含原始的更简单的值。
注意:该方法首先会检查目标枚举类应用了哪些 标签 和 Id 属性。如果存在,则优先使用这些值。如果不存在,则从case名称返回一个变体的标题值。
ExampleEnum::asSelectArray();
array:3 [▼ 0 => array:2 [▼ "text" => "First-Example" "value" => 0 ] 1 => array:2 [▼ "text" => "SecondExample (Example)" "value" => 1 ] 2 => array:2 [▼ "text" => "3rd Eg." "value" => 2 ] ]
fromName()
将标量映射到枚举实例。
ExampleEnum::fromName('FirstExample');
App\Enums\ExampleEnum {#297 ▼ +name: "FirstExample" +value: 1 }
name()
检索给定简单值的case名称。
ExampleEnum::name(1);
"FirstExample"
names()
检索包含所有case名称的数组。
ExampleEnum::names();
array:3 [▼ 0 => "FirstExample" 1 => "SecondExample" 2 => "ThirdExample" ]
toLabel()
从case名称创建一个标签。
ExampleEnum::toLabel(1);
"First Example"
toLabels()
从case名称创建并编译标签数组。
ExampleEnum::toLabels();
array:3 [▼ 0 => "First Example" 1 => "Second Example" 2 => "Third Example" ]
tryFromName()
将标量映射到枚举实例或null。
ExampleEnum::tryFromName('FirstExample');
App\Enums\ExampleEnum {#297 ▼ +name: "FirstExample" +value: 1 }
value()
检索给定case名称的简单值。
ExampleEnum::value('FirstExample');
1
values()
检索包含所有简单值的数组。
ExampleEnum::values();
array:3 [▼ 0 => 1 1 => 2 2 => 3 ]
枚举特性(HasAttributes)
首先,确保目标枚举类应用了 HasAttributes
特性,如上例中的 ExampleEnum 类 所示。
然后,您可以使用以下方法
attributes()
检索所有case的所有属性。
ExampleEnum::attributes('FirstExample');
array:5 [▼ "simpleValue" => 1 "description" => "Lorem ipsum dolor sit amet, consectetur adipiscing elit." "id" => 0 "label" => "First-Example" "metadata" => array:1 [▼ "key" => "value" ] ]
ExampleEnum::attributes('FirstExample', ['id', 'label']);
array:2 [▼ "id" => 0 "label" => "First-Example" ]
ExampleEnum::attributes();
array:3 [▼ "FirstExample" => array:5 [▼ "simpleValue" => 1 "description" => "Lorem ipsum dolor sit amet, consectetur adipiscing elit." "id" => 0 "label" => "First-Example" "metadata" => array:1 [▼ "key" => "value" ] ] "SecondExample" => array:5 [▼ "simpleValue" => 2 "description" => "Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." "id" => 1 "label" => "SecondExample (Example)" "metadata" => "{"key": "value"}" ] "ThirdExample" => array:5 [▼ "simpleValue" => 3 "description" => "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat." "id" => 2 "label" => "3rd Eg." "metadata" => [] ] ]
ExampleEnum::attributes(null, ['description', 'metadata']);
array:3 [▼ "FirstExample" => array:2 [▼ "description" => "Lorem ipsum dolor sit amet, consectetur adipiscing elit." "metadata" => array:1 [▼ "key" => "value" ] ] "SecondExample" => array:2 [▼ "description" => "Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." "metadata" => "{"key": "value"}" ] "ThirdExample" => array:2 [▼ "description" => "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat." "metadata" => [] ] ]
description()
检索描述属性。
ExampleEnum::description('FirstExample');
"Lorem ipsum dolor sit amet, consectetur adipiscing elit."
descriptions()
检索所有case的描述属性。
ExampleEnum::descriptions();
array:3 [▼ 0 => "Lorem ipsum dolor sit amet, consectetur adipiscing elit." 1 => "Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua." 2 => "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat." ]
id()
检索id属性。
ExampleEnum::id('FirstExample');
0
ids()
检索所有case的id属性。
ExampleEnum::ids();
array:3 [▼ 0 => 0 1 => 1 2 => 2 ]
label()
检索标签属性。
ExampleEnum::label('FirstExample');
"First-Example"
labels()
检索所有case的标签属性。
ExampleEnum::labels();
array:3 [▼ 0 => "First-Example" 1 => "SecondExample (Example)" 2 => "3rd Eg." ]
metadata()
检索元数据属性。
ExampleEnum::metadata('FirstExample');
array:1 [▼ "key" => "value" ]
metadatum()
检索所有case的元数据属性。
ExampleEnum::metadatum();
array:3 [▼ 0 => array:1 [▼ "key" => "value" ] 1 => "{"key": "value"}" 2 => [] ]
字符串助手宏
这些辅助函数在安装包时启动,并立即可供使用。
Str::splitConstantCase()
将 "CONSTANT_CASE" 字符串分割成由空格分隔的单词。
Str::splitConstantCase('FIRST_EXAMPLE');
"FIRST EXAMPLE"
Str::splitEnumCase()
将 "EnumCase" 字符串分割成由空格分隔的单词。
Str::splitEnumCase('FirstExample');
"First Example"