bensampo / laravel-enum
为Laravel提供的简单、可扩展且强大的枚举实现。
Requires
- php: ^8
- composer/class-map-generator: ^1
- illuminate/contracts: ^9 || ^10 || ^11
- illuminate/support: ^9 || ^10 || ^11
- laminas/laminas-code: ^3.4 || ^4
- nikic/php-parser: ^4.13.2 || ^5
Requires (Dev)
- doctrine/dbal: ^3.4
- ergebnis/composer-normalize: ^2.28.3
- larastan/larastan: ^2.6.3
- mll-lab/php-cs-fixer-config: ^5.4
- mockery/mockery: ^1.5
- orchestra/testbench: ^7.6.1 || ^8 || ^9
- phpstan/extension-installer: ^1
- phpstan/phpstan: ^1.8.2
- phpstan/phpstan-mockery: ^1.1
- phpstan/phpstan-phpunit: ^1.1.1
- phpunit/phpunit: ^9.5.21 || ^10 || ^11
- rector/rector: ^1
- symplify/rule-doc-generator: ^11 || ^12 || ^13
- dev-master
- v6.11.1
- v6.11.0
- v6.10.0
- v6.9.1
- v6.9.0
- v6.8.0
- v6.7.0
- v6.6.4
- v6.6.3
- v6.6.2
- v6.6.1
- v6.6.0
- v6.5.0
- v6.4.1
- v6.4.0
- v6.3.3
- v6.3.2
- v6.3.1
- v6.3.0
- v6.2.2
- v6.2.1
- v6.2.0
- v6.1.0
- v6.0.0
- v5.3.1
- v5.3.0
- v5.2.0
- v5.1.0
- v5.0.0
- v4.2.0
- v4.1.0
- v4.0.0
- v3.4.2
- v3.4.1
- v3.4.0
- v3.3.0
- v3.2.0
- v3.1.0
- v3.0.0
- v2.2.0
- v2.1.0
- v2.0.0
- v1.38.0
- v1.37.0
- v1.36
- v1.35
- v1.34
- v1.33
- v1.32
- v1.31
- v1.30
- v1.29
- v1.28.3
- v1.28.2
- v1.28.1
- v1.28
- v1.27
- v1.26.1
- v1.26
- v1.25
- v1.24
- v1.23
- v1.22
- v1.21.3
- v1.21.2
- v1.21.1
- v1.21
- v1.20
- v1.19.1
- 1.19
- 1.18.2
- 1.18.1
- 1.18
- 1.17.1
- 1.17.0
- 1.16.1
- 1.16.0
- 1.15.0
- 1.14.2
- 1.14.1
- 1.14.0
- 1.13.0
- 1.12.0
- 1.11.1
- 1.11
- 1.10.1
- 1.10.0
- 1.9.1
- 1.9
- 1.8.1
- 1.8.0
- 1.7.0
- 1.6.0
- 1.5.0
- 1.4.0
- 1.3.0
- 1.2.0
- 1.1.0
- 1.0.0
- dev-handle-never-type
- dev-convert-as-array
This package is auto-updated.
Last update: 2024-09-21 11:06:17 UTC
README
不再推荐使用此库
不再推荐使用此库,尤其是对于新项目。PHP 8.1 支持原生枚举。
见 #332。
关于 Laravel Enum
为Laravel提供的简单、可扩展且强大的枚举实现。
- 枚举键值对作为类常量
- 功能齐全的方法集
- 枚举实例化
- 标记/位运算枚举
- 类型提示
- 属性转换
- 枚举 artisan 生成器
- 将枚举键或值作为输入参数的验证规则
- 本地化支持
- 通过宏进行扩展
由 Ben Sampson 创建
跳转到
- 指南
- 安装
- 迁移到原生 PHP 枚举
- 枚举库
- 基本用法
- 标记/位运算枚举
- 属性转换
- 迁移
- 验证
- 本地化
- 自定义描述
- 扩展枚举基类
- Laravel Nova 集成
- PHPStan 集成
- Artisan 命令列表
- 枚举类参考
- 占位符
旧版本文档
您正在阅读 6.x
版本的文档。
- 如果您使用的是 Laravel 8,请参阅
4.x
版本的文档。 - 如果您使用的是 Laravel 7,请参阅
2.x
版本的文档。 - 如果您使用的是 Laravel 6 或更低版本,请参阅
1.x
版本的文档。
请参阅升级指南以获取有关如何升级到最新版本的信息。
指南
我写了一篇关于使用 laravel-enum 的博客文章:https://sampo.co.uk/blog/using-enums-in-laravel
安装
需要 PHP 8,以及 Laravel 9 或 10。
composer require bensampo/laravel-enum
迁移到原生 PHP 枚举
PHP 8.1 支持原生枚举。您可以使用以下步骤将 BenSampo\Enum\Enum
的使用迁移到原生 PHP 枚举。
确保您满足以下要求
- PHP 8.1 或更高版本
- Laravel 10 或更高版本
- Rector 0.17 或更高版本,您的
rector.php
包含所有相关文件 - 此库的最新版本
根据您项目的规模,您可以选择一次性迁移所有枚举,或者逐个迁移几个或一个枚举。
-
一次性转换所有枚举:
php artisan enum:to-native
-
传递枚举的完全限定类名以限制转换:
php artisan enum:to-native "App\Enums\UserType"
如果任何枚举在 Laravel 启动阶段使用,则此转换会干扰 Larastan 并防止 Rector 的第二次运行。
审查并验证代码更改以处理遗漏的边缘情况
- 参见 未实现
Enum::coerce()
:如果只传递了值,可以替换为tryFrom()
。如果还可以传递键或实例,可能需要额外的逻辑来处理这种情况。Enum::$description
和Enum::getDescription()
:实现一个替代方案。- 处理
BenSampo\Enum\Exceptions\InvalidEnumKeyException
或BenSampo\Enum\Exceptions\InvalidEnumMemberException
的 try/catch 块。可以捕获原生枚举抛出的ValueError
,或者切换到使用tryFrom()
并处理null
。
一旦所有枚举都已转换,就可以删除对该库的依赖。
枚举库
从常用社区贡献的枚举列表中进行浏览和下载。
基本用法
枚举定义
可以使用以下 Artisan 命令来生成新的枚举类
php artisan make:enum UserType
现在,只需要添加枚举可以有的可能值作为常量。
<?php declare(strict_types=1); namespace App\Enums; use BenSampo\Enum\Enum; final class UserType extends Enum { const Administrator = 0; const Moderator = 1; const Subscriber = 2; const SuperAdministrator = 3; }
这就完成了!请注意,由于枚举值被定义为普通常量,可以像访问任何其他类的常量一样访问它们。
UserType::Administrator // Has a value of 0
实例化
实例化枚举以便在函数间传递,利用类型提示是有用的。
此外,无法使用无效值实例化枚举,因此可以确定传递的值总是有效的。
为了方便,枚举可以通过多种方式实例化
// Standard new PHP class, passing the desired enum value as a parameter $enumInstance = new UserType(UserType::Administrator); // Same as the constructor, instantiate by value $enumInstance = UserType::fromValue(UserType::Administrator); // Use an enum key instead of its value $enumInstance = UserType::fromKey('Administrator'); // Statically calling the key name as a method, utilizing __callStatic magic $enumInstance = UserType::Administrator(); // Attempt to instantiate a new Enum using the given key or value. Returns null if the Enum cannot be instantiated. $enumInstance = UserType::coerce($someValue);
如果想让 IDE 自动完成静态实例化辅助函数,可以通过 artisan 命令生成 PHPDoc 注释。
默认情况下,所有位于 app/Enums
的 Enums 都将被注释(可以通过传递路径到 --folder
来更改文件夹)。
php artisan enum:annotate
可以通过指定类名来注释单个类。
php artisan enum:annotate "App\Enums\UserType"
实例属性
一旦有了枚举实例,就可以将 key
、value
和 description
作为属性访问。
$userType = UserType::fromValue(UserType::SuperAdministrator); $userType->key; // SuperAdministrator $userType->value; // 3 $userType->description; // Super Administrator
如果要将枚举实例传递到 blade 视图中,这特别有用。
实例转换
由于枚举实现了 __toString()
魔法方法,枚举实例可以转换为字符串。
这也意味着它们可以在 blade 视图中进行输出,例如。
$userType = UserType::fromValue(UserType::SuperAdministrator); (string) $userType // '3'
实例相等
可以通过将实例传递到 is
方法来检查实例是否与任何值相等。为了方便,还有一个 isNot
方法,它与 is
方法的功能相反。
$admin = UserType::Administrator(); $admin->is(UserType::Administrator); // true $admin->is($admin); // true $admin->is(UserType::Administrator()); // true $admin->is(UserType::Moderator); // false $admin->is(UserType::Moderator()); // false $admin->is('random-value'); // false
还可以使用 in
方法检查实例的值是否与可能的值数组匹配,使用 notIn
检查实例值是否不在值数组中。也可以对可迭代对象进行检查。
$admin = UserType::Administrator(); $admin->in([UserType::Moderator, UserType::Administrator]); // true $admin->in([UserType::Moderator(), UserType::Administrator()]); // true $admin->in([UserType::Moderator, UserType::Subscriber]); // false $admin->in(['random-value']); // false $admin->notIn([UserType::Moderator, UserType::Administrator]); // false $admin->notIn([UserType::Moderator(), UserType::Administrator()]); // false $admin->notIn([UserType::Moderator, UserType::Subscriber]); // true $admin->notIn(['random-value']); // true
实例化的枚举不是单例,而是每次都会创建一个新的对象。因此,不同枚举实例的严格比较 ===
总是返回 false
,无论值如何。相比之下,宽松比较 ==
将取决于值。
$admin = UserType::Administrator(); $admin === UserType::Administrator(); // false UserType::Administrator() === UserType::Administrator(); // false $admin === UserType::Moderator(); // false $admin === $admin; // true $admin == UserType::Administrator(); // true $admin == UserType::Administrator; // true $admin == UserType::Moderator(); // false $admin == UserType::Moderator; // false
类型提示
枚举实例的一个优点是它允许您使用类型提示,如下所示。
function canPerformAction(UserType $userType) { if ($userType->is(UserType::SuperAdministrator)) { return true; } return false; } $userType1 = UserType::fromValue(UserType::SuperAdministrator); $userType2 = UserType::fromValue(UserType::Moderator); canPerformAction($userType1); // Returns true canPerformAction($userType2); // Returns false
标记/位运算枚举
标准枚举一次代表一个值,但标记或位枚举可以同时表示多个值。这使得它们非常适合表达有限选项集的多个选择。一个很好的例子是用户权限,其中可能权限数量有限,但用户可以有零个、一些或所有权限。
可以使用以下 artisan 命令创建标记枚举
php artisan make:enum UserPermissions --flagged
定义值
定义值时必须使用 2 的幂,最简单的方法是使用 左移 运算符 <<
,如下所示
final class UserPermissions extends FlaggedEnum { const ReadComments = 1 << 0; const WriteComments = 1 << 1; const EditComments = 1 << 2; const DeleteComments = 1 << 3; // The next one would be `1 << 4` and so on... }
定义快捷方式
可以使用位 或 运算符 |
设置表示一组值的快捷方式。
final class UserPermissions extends FlaggedEnum { const ReadComments = 1 << 0; const WriteComments = 1 << 1; const EditComments = 1 << 2; const DeleteComments = 1 << 3; // Shortcuts const Member = self::ReadComments | self::WriteComments; // Read and write. const Moderator = self::Member | self::EditComments; // All the permissions a Member has, plus Edit. const Admin = self::Moderator | self::DeleteComments; // All the permissions a Moderator has, plus Delete. }
实例化标记枚举
实例化标记枚举有几种方法
// Standard new PHP class, passing the desired enum values as an array of values or array of enum instances $permissions = new UserPermissions([UserPermissions::ReadComments, UserPermissions::EditComments]); $permissions = new UserPermissions([UserPermissions::ReadComments(), UserPermissions::EditComments()]); // Static flags method, again passing the desired enum values as an array of values or array of enum instances $permissions = UserPermissions::flags([UserPermissions::ReadComments, UserPermissions::EditComments]); $permissions = UserPermissions::flags([UserPermissions::ReadComments(), UserPermissions::EditComments()]);
属性转换 与单值枚举的工作方式相同。
空标记枚举
标记枚举可以完全不包含值。每个标记枚举都有一个预定义的常量 None
,它与 0
相当。
UserPermissions::flags([])->value === UserPermissions::None; // True
标记枚举方法
除了标准枚举方法外,标记枚举还有一系列有用的方法。
注意:任何传递静态属性的地方,您也可以传递枚举实例。
setFlags(array $flags): Enum
将枚举的标志设置为给定的标志数组。
$permissions = UserPermissions::flags([UserPermissions::ReadComments]); $permissions->flags([UserPermissions::EditComments, UserPermissions::DeleteComments]); // Flags are now: EditComments, DeleteComments.
addFlag($flag): Enum
将给定的标志添加到枚举中
$permissions = UserPermissions::flags([UserPermissions::ReadComments]); $permissions->addFlag(UserPermissions::EditComments); // Flags are now: ReadComments, EditComments.
addFlags(array $flags): Enum
将给定的标志添加到枚举中
$permissions = UserPermissions::flags([UserPermissions::ReadComments]); $permissions->addFlags([UserPermissions::EditComments, UserPermissions::WriteComments]); // Flags are now: ReadComments, EditComments, WriteComments.
addAllFlags(): Enum
将所有标志添加到枚举中
$permissions = UserPermissions::flags([UserPermissions::ReadComments]); $permissions->addAllFlags(); // Enum now has all flags
removeFlag($flag): Enum
从枚举中删除给定的标志
$permissions = UserPermissions::flags([UserPermissions::ReadComments, UserPermissions::WriteComments]); $permissions->removeFlag(UserPermissions::ReadComments); // Flags are now: WriteComments.
removeFlags(array $flags): Enum
从枚举中删除给定的标志
$permissions = UserPermissions::flags([UserPermissions::ReadComments, UserPermissions::WriteComments, UserPermissions::EditComments]); $permissions->removeFlags([UserPermissions::ReadComments, UserPermissions::WriteComments]); // Flags are now: EditComments.
removeAllFlags(): Enum
从枚举中删除所有标志
$permissions = UserPermissions::flags([UserPermissions::ReadComments, UserPermissions::WriteComments]); $permissions->removeAllFlags();
hasFlag($flag): bool
检查枚举是否具有指定的标志。
$permissions = UserPermissions::flags([UserPermissions::ReadComments, UserPermissions::WriteComments]); $permissions->hasFlag(UserPermissions::ReadComments); // True $permissions->hasFlag(UserPermissions::EditComments); // False
hasFlags(array $flags): bool
检查枚举是否具有所有指定的标志。
$permissions = UserPermissions::flags([UserPermissions::ReadComments, UserPermissions::WriteComments]); $permissions->hasFlags([UserPermissions::ReadComments, UserPermissions::WriteComments]); // True $permissions->hasFlags([UserPermissions::ReadComments, UserPermissions::EditComments]); // False
notHasFlag($flag): bool
检查枚举是否不具有指定的标志。
$permissions = UserPermissions::flags([UserPermissions::ReadComments, UserPermissions::WriteComments]); $permissions->notHasFlag(UserPermissions::EditComments); // True $permissions->notHasFlag(UserPermissions::ReadComments); // False
notHasFlags(array $flags): bool
检查枚举是否不具有任何指定的标志。
$permissions = UserPermissions::flags([UserPermissions::ReadComments, UserPermissions::WriteComments]); $permissions->notHasFlags([UserPermissions::ReadComments, UserPermissions::EditComments]); // True $permissions->notHasFlags([UserPermissions::ReadComments, UserPermissions::WriteComments]); // False
getFlags(): Enum[]
以实例数组的形式返回标志。
$permissions = UserPermissions::flags([UserPermissions::ReadComments, UserPermissions::WriteComments]); $permissions->getFlags(); // [UserPermissions::ReadComments(), UserPermissions::WriteComments()];
hasMultipleFlags(): bool
检查枚举上是否设置了多个标志。
$permissions = UserPermissions::flags([UserPermissions::ReadComments, UserPermissions::WriteComments]); $permissions->hasMultipleFlags(); // True; $permissions->removeFlag(UserPermissions::ReadComments)->hasMultipleFlags(); // False
getBitmask(): int
获取枚举的位掩码。
UserPermissions::Member()->getBitmask(); // 11; UserPermissions::Moderator()->getBitmask(); // 111; UserPermissions::Admin()->getBitmask(); // 1111; UserPermissions::DeleteComments()->getBitmask(); // 1000;
Eloquent查询中的标记枚举
要在Eloquent查询中直接使用标记枚举,您可以在模型上使用QueriesFlaggedEnums
特质,它为您提供了以下方法
hasFlag($column, $flag): Builder
User::hasFlag('permissions', UserPermissions::DeleteComments())->get();
notHasFlag($column, $flag): Builder
User::notHasFlag('permissions', UserPermissions::DeleteComments())->get();
hasAllFlags($column, $flags): Builder
User::hasAllFlags('permissions', [UserPermissions::EditComment(), UserPermissions::ReadComment()])->get();
hasAnyFlags($column, $flags): Builder
User::hasAnyFlags('permissions', [UserPermissions::DeleteComments(), UserPermissions::EditComments()])->get();
属性转换
您可以使用Laravel内置的自定义转换将模型属性转换为枚举。这将将在获取时将属性转换为枚举实例,在设置时将枚举值转换回枚举。由于 Enum::class
实现了 Castable
协议,因此您只需要指定枚举的类名
use BenSampo\Enum\Tests\Enums\UserType; use Illuminate\Database\Eloquent\Model; class Example extends Model { protected $casts = [ 'random_flag' => 'boolean', // Example standard laravel cast 'user_type' => UserType::class, // Example enum cast ]; }
现在,当您访问 Example
模型的 user_type
属性时,基础值将以 UserType
枚举的形式返回。
$example = Example::first(); $example->user_type // Instance of UserType
请参阅枚举实例上可用的方法和属性,以充分利用属性转换。
您可以通过传递枚举值或另一个枚举实例来设置值。
$example = Example::first(); // Set using enum value $example->user_type = UserType::Moderator; // Set using enum instance $example->user_type = UserType::Moderator();
自定义 $model->toArray()
行为
当使用 toArray
(或将模型/模型从控制器作为响应返回)时,Laravel将调用枚举实例的 toArray
方法。
默认情况下,这将仅返回其原生类型中的值。您可能还想访问其他属性(键、描述),例如返回到javascript应用程序。
要自定义此行为,您可以在枚举实例上覆盖 toArray
方法。
// Example Enum final class UserType extends Enum { const ADMINISTRATOR = 0; const MODERATOR = 1; } $instance = UserType::Moderator(); // Default public function toArray() { return $this->value; } // Returns int(1) // Return all properties public function toArray() { return $this; } // Returns an array of all the properties // array(3) { // ["value"]=> // int(1)" // ["key"]=> // string(9) "MODERATOR" // ["description"]=> // string(9) "Moderator" // }
转换基础原生类型
许多数据库将所有内容都返回为字符串(例如,整数可能返回为字符串 '1'
)。为了减少库用户的摩擦,我们使用类型强制来识别预期值。如果您想控制这一点,可以覆盖枚举类上的 parseDatabase
静态方法
final class UserType extends Enum { const Administrator = 0; const Moderator = 1; public static function parseDatabase($value) { return (int) $value; } }
从 parseDatabase
方法返回 null
将导致模型上的属性也变为 null
。这可能在您的数据库存储不一致的空白值时很有用,例如,用空字符串而不是 NULL
。
模型注解
如果您正在将模型属性转换为枚举,可以使用 laravel-ide-helper 包自动为您生成属性文档块。
迁移
推荐
由于枚举在代码级别强制一致性,因此不需要在数据库级别再次这样做,因此推荐数据库列的数据类型为string
或int
,具体取决于您的枚举值。这意味着您可以在代码中添加/删除枚举值,而无需担心您的数据库层。
use App\Enums\UserType; use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateUsersTable extends Migration { /** * Run the migrations. * * @return void */ public function up(): void { Schema::table('users', function (Blueprint $table): void { $table->bigIncrements('id'); $table->timestamps(); $table->string('type') ->default(UserType::Moderator); }); } }
使用enum
列类型
或者,您可以在迁移中使用Enum
类来定义枚举列。枚举值必须定义为字符串。
use App\Enums\UserType; use Illuminate\Support\Facades\Schema; use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateUsersTable extends Migration { /** * Run the migrations. * * @return void */ public function up(): void { Schema::table('users', function (Blueprint $table): void { $table->bigIncrements('id'); $table->timestamps(); $table->enum('type', UserType::getValues()) ->default(UserType::Moderator); }); } }
验证
数组验证
枚举值
您可以使用EnumValue
规则来验证传递给控制器的枚举值是否是给定枚举的有效值。
use BenSampo\Enum\Rules\EnumValue; public function store(Request $request) { $this->validate($request, [ 'user_type' => ['required', new EnumValue(UserType::class)], ]); }
默认情况下,类型检查设置为严格,但您可以通过将false
传递给EnumValue
类的可选第二个参数来绕过此设置。
new EnumValue(UserType::class, false) // Turn off strict type checking.
枚举键
您还可以使用EnumKey
规则来验证键。如果您将枚举键用作URL参数进行排序或筛选等,这很有用。
use BenSampo\Enum\Rules\EnumKey; public function store(Request $request) { $this->validate($request, [ 'user_type' => ['required', new EnumKey(UserType::class)], ]); }
枚举实例
此外,您还可以验证一个参数是否是给定枚举的实例。
use BenSampo\Enum\Rules\Enum; public function store(Request $request) { $this->validate($request, [ 'user_type' => ['required', new Enum(UserType::class)], ]); }
管道验证
您还可以使用'管道'语法来指定规则。
enum_value:enum_class,[strict]
enum_key:enum_class
enum:enum_class
'user_type' => 'required|enum_value:' . UserType::class, 'user_type' => 'required|enum_key:' . UserType::class, 'user_type' => 'required|enum:' . UserType::class,
本地化
验证消息
运行以下命令以将语言文件发布到您的lang
文件夹。
php artisan vendor:publish --provider="BenSampo\Enum\EnumServiceProvider" --tag="translations"
枚举描述
您可以使用Laravel内置的本地化功能来翻译由getDescription
方法返回的字符串。
为您的每种受支持语言添加一个新的enums.php
键文件。例如,这里有一个英文和一个西班牙语。
// lang/en/enums.php <?php declare(strict_types=1); use App\Enums\UserType; return [ UserType::class => [ UserType::Administrator => 'Administrator', UserType::SuperAdministrator => 'Super administrator', ], ];
// lang/es/enums.php <?php declare(strict_types=1); use App\Enums\UserType; return [ UserType::class => [ UserType::Administrator => 'Administrador', UserType::SuperAdministrator => 'Súper administrador', ], ];
现在,您只需确保您的枚举实现了以下所示的LocalizedEnum
接口
use BenSampo\Enum\Enum; use BenSampo\Enum\Contracts\LocalizedEnum; final class UserType extends Enum implements LocalizedEnum { // ... }
getDescription
方法现在将在您的本地化文件中查找值。如果给定键不存在值,则返回默认描述。
自定义描述
自定义类描述
如果您想为枚举类返回自定义描述,请向您的Enum类添加一个Description
属性
use BenSampo\Enum\Enum; use BenSampo\Enum\Attributes\Description; #[Description('List of available User types')] final class UserType extends Enum { ... }
现在调用UserType::getClassDescription()
返回可用的用户类型列表
而不是用户类型
。
如果您想对描述有更多控制,可以覆盖基枚举类上的getClassDescription
方法。
自定义值描述
如果您想为枚举值返回自定义描述,请向您的枚举常量添加一个Description
属性
use BenSampo\Enum\Enum; use BenSampo\Enum\Attributes\Description; final class UserType extends Enum { const Administrator = 'Administrator'; #[Description('Super admin')] const SuperAdministrator = 'SuperAdministrator'; }
现在调用UserType::SuperAdministrator()->description
返回超级管理员
而不是超级管理员
。
如果您想对描述有更多控制,可以覆盖基枚举类上的getDescription
方法。
扩展枚举基类
Enum
基类实现了Laravel Macroable
特质,这意味着它很容易通过您自己的函数进行扩展。如果您有一个经常添加到每个枚举中的函数,您可以使用宏。
假设我们想能够获取枚举asArray
方法的反转版本,我们可以这样做
Enum::macro('asFlippedArray', function() { return array_flip(self::asArray()); });
现在,在枚举中的每个,我都可以通过调用UserType::asFlippedArray()
来调用它。
最好在服务提供商的boot方法中注册宏。
Laravel Nova 集成
使用Simple Squid的nova-enum-field包来轻松创建Nova中的枚举字段。请参阅他们的readme以获取使用方法。
PHPStan 集成
如果您正在使用PHPStan进行静态分析,请启用以下扩展以
- 正确识别魔术实例化方法
- 检测重复的枚举值
使用PHPStan 扩展安装器或将以下内容添加到项目的phpstan.neon
文件中
includes: - vendor/bensampo/laravel-enum/extension.neon
Artisan 命令列表
php artisan make:enum
创建一个新的枚举类。传递--flagged
选项以创建带标志的枚举。
了解更多信息
php artisan enum:annotate
为枚举类生成DocBlock注释。
了解更多信息
php artisan enum:to-native
查看迁移到原生PHP枚举。
枚举类参考
static getKeys(mixed $values = null): array
返回枚举的所有键或自定义键集的数组。
UserType::getKeys(); // Returns ['Administrator', 'Moderator', 'Subscriber', 'SuperAdministrator'] UserType::getKeys(UserType::Administrator); // Returns ['Administrator'] UserType::getKeys(UserType::Administrator, UserType::Moderator); // Returns ['Administrator', 'Moderator'] UserType::getKeys([UserType::Administrator, UserType::Moderator]); // Returns ['Administrator', 'Moderator']
static getValues(mixed $keys = null): array
返回枚举的所有值或自定义值集的数组。
UserType::getValues(); // Returns [0, 1, 2, 3] UserType::getValues('Administrator'); // Returns [0] UserType::getValues('Administrator', 'Moderator'); // Returns [0, 1] UserType::getValues(['Administrator', 'Moderator']); // Returns [0, 1]
static getKey(mixed $value): string
返回给定枚举值的键。
UserType::getKey(1); // Returns 'Moderator' UserType::getKey(UserType::Moderator); // Returns 'Moderator'
static getValue(string $key): mixed
返回给定枚举键的值。
UserType::getValue('Moderator'); // Returns 1
static hasKey(string $key): bool
检查枚举是否包含给定的键。
UserType::hasKey('Moderator'); // Returns 'True'
static hasValue(mixed $value, bool $strict = true): bool
检查枚举是否包含给定的值。
UserType::hasValue(1); // Returns 'True' // It's possible to disable the strict type checking: UserType::hasValue('1'); // Returns 'False' UserType::hasValue('1', false); // Returns 'True'
static getClassDescription(): string
返回枚举类的句法名称。如果猜测的描述不合适,可以自定义描述。
UserType::getClassDescription(); // Returns 'User type'
static getDescription(mixed $value): string
返回枚举值的句法键。如果猜测的描述不合适,可以自定义描述。
UserType::getDescription(3); // Returns 'Super administrator' UserType::getDescription(UserType::SuperAdministrator); // Returns 'Super administrator'
static getRandomKey(): string
返回枚举中的随机键。对工厂类很有用。
UserType::getRandomKey(); // Returns 'Administrator', 'Moderator', 'Subscriber' or 'SuperAdministrator'
static getRandomValue(): mixed
返回枚举中的随机值。对工厂类很有用。
UserType::getRandomValue(); // Returns 0, 1, 2 or 3
static getRandomInstance(): mixed
返回枚举的随机实例。对工厂类很有用。
UserType::getRandomInstance(); // Returns an instance of UserType with a random value
static asArray(): array
以关联数组的形式返回枚举键值对。
UserType::asArray(); // Returns ['Administrator' => 0, 'Moderator' => 1, 'Subscriber' => 2, 'SuperAdministrator' => 3]
static asSelectArray(): array
返回枚举,用于select中的value => description。
UserType::asSelectArray(); // Returns [0 => 'Administrator', 1 => 'Moderator', 2 => 'Subscriber', 3 => 'Super administrator']
static fromValue(mixed $enumValue): Enum
返回调用枚举的实例。更多信息请参阅枚举实例化。
UserType::fromValue(UserType::Administrator); // Returns instance of Enum with the value set to UserType::Administrator
static getInstances(): array
返回调用枚举的所有可能实例的数组,以常量名称为键。
var_dump(UserType::getInstances()); array(4) { 'Administrator' => class BenSampo\Enum\Tests\Enums\UserType#415 (3) { public $key => string(13) "Administrator" public $value => int(0) public $description => string(13) "Administrator" } 'Moderator' => class BenSampo\Enum\Tests\Enums\UserType#396 (3) { public $key => string(9) "Moderator" public $value => int(1) public $description => string(9) "Moderator" } 'Subscriber' => class BenSampo\Enum\Tests\Enums\UserType#393 (3) { public $key => string(10) "Subscriber" public $value => int(2) public $description => string(10) "Subscriber" } 'SuperAdministrator' => class BenSampo\Enum\Tests\Enums\UserType#102 (3) { public $key => string(18) "SuperAdministrator" public $value => int(3) public $description => string(19) "Super administrator" } }
static coerce(mixed $enumKeyOrValue): ?Enum
尝试使用给定的键或值实例化一个新的枚举。如果枚举无法实例化,则返回null。
UserType::coerce(0); // Returns instance of UserType with the value set to UserType::Administrator UserType::coerce('Administrator'); // Returns instance of UserType with the value set to UserType::Administrator UserType::coerce(99); // Returns null (not a valid enum value)
占位符
运行以下命令将存根文件发布到应用程序根目录下的stubs
文件夹。
php artisan vendor:publish --provider="BenSampo\Enum\EnumServiceProvider" --tag="stubs"