zlikavac32 / php-enum-doctrine
Doctrine PHP 枚举支持
Requires
- php: ^7.4
- doctrine/dbal: ^2.10
- zlikavac32/php-enum: ^3.0
Requires (Dev)
- doctrine/orm: ^2.7
- phpunit/phpunit: ^8.2
This package is auto-updated.
Last update: 2024-09-13 11:35:08 UTC
README
Doctrine 支持 zlikavac32/php-enum。
目录
安装
建议通过 Composer 进行安装。
composer require zlikavac32/php-enum-doctrine
用法
假设存在一个有效的枚举 \YesNoEnum。
创建一个新的类型,该类型扩展 \Zlikavac32\DoctrineEnum\DBAL\Types\EnumType。
use Zlikavac32\DoctrineEnum\DBAL\Types\EnumType; class YesNoEnumType extends EnumType { // ... }
接下来,定义 protected function enumClass(): string。此方法应返回该类型向 Doctrine 暴露的枚举类的全限定名 (FQN)。
protected function enumClass(): string { return \YesNoEnum::class; }
定义 Doctrine 方法 public function getName(): string 以定义类型的名称。
public function getName(): string { return 'enum_yes_no'; }
就是这样。剩下要做的就是使用以下方法注册类型
\Doctrine\DBAL\Types\Type::addType('enum_yes_no', \YesNoEnumType::class);
现在您可以使用 enum_yes_no 类型。
/** * @Column(type="enum_yes_no", nullable=true) * @var \YesNoEnum|null */ private $yesNo;
有关自定义 Doctrine 映射类型的更多信息,请参阅官方文档。
自定义列长度
内部库使用 varchar 类型,最大长度为 32。如果您想根据自己需求调整长度,只需重写方法 protected function columnLength(): int。
protected function columnLength(): int { return 16; }
注意,在类型首次使用时,所有枚举元素名称都会与指定的列长度进行比较。如果检测到超过最大长度的名称,将抛出 \LogicException。
自定义表示
默认情况下,枚举元素的名称用于其在数据库中的表示。要更改此行为,重写方法 enumToDatabaseValue() 和 databaseValueToEnum()。
限制
此库不使用平台依赖的类型,如 MySQL 中的 enum 或 PostgreSQL 中的自定义类型。相反,使用 varchar。
这样做的原因是
Doctrine无法比较枚举内容,因为这是类型的内在属性- 对于
PostgresSQL,我们无法比较列,因为类型不在 Doctrine 的控制之下 - 无法使用列约束,因为它们会破坏
ALTER语法
如果您知道如何避免这些问题,请告知我。
进一步工作
找出如何克服 限制 中的问题。