bensampo/laravel-enum

为Laravel提供的简单、可扩展且强大的枚举实现。

资助包维护!
bensampo

安装量: 10,824,655

依赖者: 108

建议者: 5

安全: 0

星标: 1,991

关注者: 14

分支: 163

公开问题: 4

v6.11.1 2024-08-21 10:45 UTC

README

Laravel Enum

Packagist Stable Version Packagist downloads MIT Software License

不再推荐使用此库

不再推荐使用此库,尤其是对于新项目。PHP 8.1 支持原生枚举。

#332

关于 Laravel Enum

为Laravel提供的简单、可扩展且强大的枚举实现。

  • 枚举键值对作为类常量
  • 功能齐全的方法集
  • 枚举实例化
  • 标记/位运算枚举
  • 类型提示
  • 属性转换
  • 枚举 artisan 生成器
  • 将枚举键或值作为输入参数的验证规则
  • 本地化支持
  • 通过宏进行扩展

Ben Sampson 创建

跳转到

旧版本文档

您正在阅读 6.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::$descriptionEnum::getDescription():实现一个替代方案。
  • 处理 BenSampo\Enum\Exceptions\InvalidEnumKeyExceptionBenSampo\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"

实例属性

一旦有了枚举实例,就可以将 keyvaluedescription 作为属性访问。

$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 包自动为您生成属性文档块。

迁移

推荐

由于枚举在代码级别强制一致性,因此不需要在数据库级别再次这样做,因此推荐数据库列的数据类型为stringint,具体取决于您的枚举值。这意味着您可以在代码中添加/删除枚举值,而无需担心您的数据库层。

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"