zlikavac32/php-enum-doctrine

Doctrine PHP 枚举支持

0.6.0 2020-04-13 02:10 UTC

This package is auto-updated.

Last update: 2024-09-13 11:35:08 UTC


README

Build Status Latest Stable Version License Scrutinizer Code Quality Codacy Badge

Doctrine 支持 zlikavac32/php-enum

目录

  1. 安装
  2. 用法
    1. 自定义列长度
    2. 自定义表示
  3. 限制
  4. 进一步工作

安装

建议通过 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 语法

如果您知道如何避免这些问题,请告知我。

进一步工作

找出如何克服 限制 中的问题。