Download the PHP package hyperf-ext/enum without Composer
On this page you can find all versions of the php package hyperf-ext/enum. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download hyperf-ext/enum
More information about hyperf-ext/enum
Files in hyperf-ext/enum
Package enum
Short Description Simple, extensible and powerful enumeration implementation for Hyperf.
License MIT
Informations about the package enum
Hyperf 枚举组件
关于
简单、可扩展且强大的枚举实现。
- 枚举键值对即类常量
- 功能完备的方法集
- 枚举实例化
- 位标志/位移枚举
- 类型提示
- 属性转换
- 枚举命令生成器
- 用于将枚举键或值作为输入参数传递的验证规则
- 本地化支持
- 可通过宏扩展
移植自
bensampo/laravel-enum
。
索引
- 安装
- 基本使用
- 枚举定义
- 实例化
- 实例属性
- 实例类型转换
- 实例相等性比较
- 类型提示
- 位标志/位移枚举
- 属性转换
- 数据库迁移
- 验证器
- 本地化
- 重写 getDescription 方法
- 扩展枚举基类
- PHPStan 集成
- 命令列表
- Enum 类参考
安装
基本用法
枚举定义
可以使用一些命令来生成新的枚举类:
现在只需将所有可能值作为常量添加到枚举类即可。
这样就完成了。注意,由于枚举值被定义为常量,你可以像使用其他类常量一样简单地使用它们。
实例化
实例化枚举有助于在传递它们时带来类型提示的益处。
此外,由于无效的值不能被实例化,因此可以确保传递的值是始终有效的。
为了方便,枚举可以通过多种方式来实例化:
如果要使用 IDE 的自动完成,则可以通过命令生成 PHPDoc 注释。
默认情况下,app/Enum
目录中的所有枚举都会被添加相关注释(可以通过将目录路径传递给 --folder
选项来更改目录)。
也可以通过指定类名来为某个类添加注释。
实例属性
有了枚举实例后,可以将 key
、value
和 description
作为属性来访问。
这个功能在要将枚举实例传递到视图的场景下会很有用。
实例类型转换
枚举实例可以在实现 __toString()
魔术方法时转换为字符串。这也意味着它们可以在视图中直接输出。
实例相等性比较
我们可以通过将任意值传递给实例的 is
方法来确定实例是否与这些相等。为了方便起见,还有一个 isNot
方法,它与 is
方法的逻辑完全相反。
还可以使用 in
方法来确定实例的值是否与可能值的数组匹配。
类型提示
另一个枚举实例的益处是让我们可以使用类型提示,如下所示。
位标志/位移枚举
标准枚举一次只能表示一个值,但是位标志或位移枚举可以同时表示多个值。当要表达一组选项的多个选择时,这是最佳的选择。一个很好的例子就是用户权限,其中可能的权限数量有限,但是用户可以没有权限或是拥有全部或部分权限。
可以使用以下命令生成位标志枚举:
定义值
定义值时,必须使用 2
的幂,最简单的方法是使用左移位 <<
运算符,如下所示:
定义位标志组合
可以使用按位或 |
表示一组给定值的组合值作为快捷方式来使用。
实例化位标志枚举
有几种方法可以实例化位标志枚举:
属性转换的工作方式与单值枚举相同。
空位标志枚举
位标志枚举可以不包含任何值。每个标记的枚举都有一个预定义的常量 None
,相当于 0
。
位标志枚举方法
除了标准的枚举方法,位标志枚举还提供了一组有用的方法。
注意:在任何可以传递静态属性的地方,也可以传递枚举实例。
setFlags(array $flags): Enum
将枚举的位标志设置为给定的位标志数组。
addFlag($flag): Enum
添加给定的位标志到枚举。
addFlags(array $flags): Enum
添加一组给定的位标志到枚举。
removeFlag($flag): Enum
从枚举中移除给定的位标志。
removeFlags(array $flags): Enum
从枚举中移除一组给定的位标志。
hasFlag($flag): bool
确定枚举中是否存在指定的位标志。
hasFlags(array $flags): bool
确定枚举中是否存在指定的全部位标志。
notHasFlag($flag): bool
确定枚举中是否不存在指定的位标志。
notHasFlags(array $flags): bool
确定枚举中是否不存在指定的任何一个位标志。
getFlags(): Enum[]
将位标志作为实例数组返回。
hasMultipleFlags(): bool
确定枚举是否有多个位标志。
getBitmask(): int
获取枚举的位掩码。
属性转换
我们可以使用 Hyperf 内置的自定义类型转换将模型属性转换为枚举。这将在获取时将属性强制转换为枚举实例,并在设置时转回为枚举值。
由于 Enum::class
实现了 Castable
接口,因此只需要指定枚举的类名即可:
现在,当访问 Example
模型的 user_type
属性时,基础值将作为 UserType
枚举返回。
查阅枚举实例可用的方法和属性,以充分了解属性转换。
我们还可以通过传递枚举值或另一个枚举实例来设置该值。
转换基础原生类型
有些数据库会以字符串的形式返回所有内容(例如,整数可能以字符串 '1'
的形式返回)。
为了减少用户的麻烦,我们使用强类型来确定预期值。如果期望控制它,则可以在枚举类上重写 parseDatabase
静态方法:
从 parseDatabase
方法中返回 null
会使模型上的属性也为 null
。如果数据库存储了不一致的空白值(例如空字符串)而不是 NULL
,那么这会很有用。
数据库迁移
推荐
由于枚举在代码级别强制一致性,因此不必在数据库级别再做这些工作。依据枚举值,数据库字段的推荐类型为 string
或 int
。这就意味着我们可以在代码中添加或删除枚举值,而不必顾及数据库层。
使用 enum
字段类型
另外,我们可以在迁移中使用枚举来定义枚举字段。枚举值必须定义为字符串。
验证器
数组验证器
枚举值
我们可以使用 EnumValue
规则来验证传递的枚举值是否是给定枚举的有效值。
默认情况下,类型检查被设置为严格模式,但是可以通过向 EnumValue
类的可选第二个参数传递 false
来绕过此检查。
枚举键
我们也可以使用 EnumKey
规则对枚举键进行验证。例如,如果将枚举键用作 URL 参数进行排序或过滤,这会很有用。
枚举实例
另外,我们可以验证参数是否为给定枚举的实例。
管道验证
也可以将“管道”语法用于验证规则。
enum_value_:enumclass,[strict]
enum_key_:enumclass
enum_:enumclass
本地化
本地化支持依赖 hyperf/translation
组件,不要忘记发布其配置并按需设置。
关于 hyperf/translation
组件的使用请阅读 Hyperf 官方文档 。
验证器错误信息
运行以下命令将语言文件发布到你的 storage/languages
目录中。
枚举描述
如果尚未通过 vendor:publish
命令发布语言文件,请先按照上面那条命令来发布。
在此示例中,我们配置了英语和西班牙语两个语言文件。
最后,只需确保枚举类实现 LocalizedEnum
接口即可,如下所示:
getDescription
方法将在语言文件中查找翻译的文本。如果给定键的值不存在,则返回默认描述。
重写 getDescription 方法
如果要通过 getDescription
方法返回自定义值,可以在枚举类中重写该方法来实现:
现在,调用 UserType::getDescription(3);
将返回 Super administator
而不是 Super admin
。
扩展枚举基类
枚举基类 Enum
实现了 Hyperf Macroable 特性,这意味着我们可以使用自己的函数轻松对其进行扩展。如果有经常要添加到每个枚举的函数,则可以使用宏。
假设我们期望获得枚举类 asArray
方法的键值反转的版本,可以使用以下方法完成此操作:
现在在每个枚举中都可以使用 UserType::asFlippedArray()
来调用它。
建议通过监听服务启动相关事件来注册宏。
PHPStan 集成
如果要使用 PHPStan 进行静态分析,可以启用扩展程序以正确识别魔术实例化方法。
将以下内容添加到项目的 phpstan.neon
的 includes 中:
命令列表
生成一个新的枚举类。传递 --flagged
选项可以创建位标志枚举。了解更多
为枚举类生成 DocBlock 注释。了解更多
Enum 类参考
static getKeys(): array
返回包含枚举所有键的数组。
static getValues(): array
返回包含枚举所有值的数组。
static getKey(mixed $value): string
返回给定枚举值的键。
static getValue(string $key): mixed
返回给定枚举键的值。
static hasKey(string $key): bool
确定枚举中是否含有给定的键。
static hasValue(mixed $value, bool $strict = true): bool
确定枚举中是否含有给定的值。
static getDescription(mixed $value): string
以句首字母大写形式返回枚举键。可以通过重写 getDescription 方法来返回自定义描述。
static getRandomKey(): string
随机返回枚举的一个键。
static getRandomValue(): mixed
随机返回枚举的一个值。
static getRandomInstance(): mixed
随机返回枚举的一个实例。
static asArray(): array
将枚举键值作为关联数组返回。
static asSelectArray(): array
返回 value => description 形式的数组。
static fromValue(mixed $enumValue): Enum
返回被调用枚举的实例。进一步了解枚举实例化。
static getInstances(): array
返回一个包含被调用枚举的所有可能实例的数组,以常量名作为键。
static coerce(mixed $enumKeyOrValue): ?Enum
尝试使用给定的键或值实例化一个新的枚举。如果无法实例化,则返回 null
。
All versions of enum with dependencies
ext-json Version *
ext-swoole Version >=4.5
doctrine/dbal Version ^3.0
hanneskod/classtools Version ~1.0
hyperf/database Version ~2.2.0
hyperf/di Version ~2.2.0
hyperf/filesystem Version ~2.2.0
hyperf/framework Version ~2.2.0
hyperf/validation Version ~2.2.0
laminas/laminas-code Version ^3.4