brandembassy/doctrine-enum-type

1.3.0 2024-02-15 07:19 UTC

README

CircleCI Total Downloads Latest Stable Version

Doctrine Enum 类型

此扩展使您在 Doctrine 实体中使用枚举变得简单。

为什么要使用枚举

  • 您可以检查传递的值的类型
  • 您可以说明哪些值是有效的
  • 您可以为您的枚举类添加有用的方法

安装

composer require brandembassy/doctrine-enum-type

选择枚举库

目前支持三种枚举库

不用担心,您可以使用其他 Enum 实现,只需创建实现 BrandEmbassy\Doctrine\EnumType\EnumImplementation 接口的桥梁即可。

用法

设置 Doctrine

假设我们有一个颜色枚举

class Color extends Enum
{

    public const BLACK = 'black';
    public const WHITE = 'white';
    public const RED = 'read';
    public const GREEN = 'green';
    public const BLUE = 'blue';

}

现在我们需要让 Doctrine 了解我们的枚举类。您可以使用 BrandEmbassy\Doctrine\EnumType\EnumTypesManager 来实现这一点

use BrandEmbassy\Doctrine\EnumType\Bridges\MarcMabeEnum\MarcMabeEnumBridge;
use BrandEmbassy\Doctrine\EnumType\EnumTypesManager;

$enumTypesManager = new EnumTypesManager(new MarcMabeEnumBridge());
$enumTypesManager->addEnumTypeDefinition('enumColor', Color::class);

$enumTypesManager->initializeEnumTypes();

此初始化必须在处理实体或使用您的枚举的架构之前完成。

EnumTypesManager 的第一个参数是实现 BrandEmbassy\Doctrine\EnumType\EnumImplementation 的对象,该对象描述了您使用的枚举实现。

addEnumTypeDefinition 方法接受您想在实体中使用的枚举名称,第二个参数是您的枚举类。

开始在实体中使用枚举

我们已经准备好开始,现在我们可以定义使用颜色枚举的汽车实体

use Doctrine\ORM\Mapping as ORM;

/**
 * @ORM\Entity
 * @ORM\Table(name="car")
 */
final class Car
{

    /**
     * @ORM\Id
     * @ORM\Column(type="integer")
     * @ORM\GeneratedValue
     * @var int
     */
    private $id;

    /**
     * @ORM\Column(type="string")
     * @var string
     */
    private $brand;

    /**
     * @ORM\Column(type="enumColor")
     * @var Color
     */
    private $color;

    public function __construct(string $brand, Color $color)
    {
        $this->brand = $brand;
        $this->color = $color;
    }

    ...

    public function getColor(): Color
    {
        return $this->color;
    }

    public function setColor(Color $color): void
    {
        $this->color = $color;
    }

}

$user = new User('Skoda', Color::get(Color::GREEN));

内部

此库生成的数据库列类型为 VARCHAR(255)。这给您的枚举带来了一个约束:枚举的值不能超过255个字符。