vkollin/doctrine-backed-enum-fields-bundle

通过生成枚举字段而不是字符串字段,真正支持Doctrine中的后端枚举。

1.4.1 2024-05-02 12:16 UTC

This package is auto-updated.

Last update: 2024-09-02 12:58:43 UTC


README

此库为您的Doctrine实体提供对PHP 8.1中引入的枚举的支持,并将为您生成枚举字段。

Doctrine引入了某种枚举支持,但这只会给您字符串字段。

感谢

本项目由bpolaszek/doctrine-native-enums Beno!t POLASZEK分叉,并深受此博客文章的启发。

安装

composer require vkollin/doctrine-backed-enum-fields-bundle

使用

此库仅适用于后端枚举

在Symfony项目中

1. 声明该包。

// config/bundles.php

return [
    // ...
    VKollin\Doctrine\BackedEnumFields\Bundle\DoctrineBackedEnumFieldsBundle::class => ['all' => true],
];

2. 在配置中注册枚举。

# config/packages/doctrine_backed_enum_fields.yaml

doctrine_backed_enum_fields:
  enum_types:
    App\Entity\StatusEnum: ~
    #App\Entity\StatusEnum: status # Alternatively, if you want your type to be named "status"

3. 在实体中使用它们。

declare(strict_types=1);

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
final class Book
{
    #[
        ORM\Id,
        ORM\Column(unique: true),
        ORM\GeneratedValue(strategy: 'AUTO'),
    ]
    public int $id;

    #[ORM\Column]
    public string $name;

    #[ORM\Column(type: StatusEnum::class)]
    public StatusEnum $status;
}

键中的枚举

您需要使用自定义id生成器来使用枚举作为键。还需要将GeneratedValue策略设置为CUSTOM。否则,自定义id生成器将不会被使用。但这里不会生成任何内容。

#[ORM\Column(name: 'type', type: StatusEnum::class, nullable: false)]
#[ORM\GeneratedValue(strategy: 'CUSTOM')]
#[ORM\CustomIdGenerator(EnumIdGenerator::class)]
#[ORM\Id]
private StatusEnum $status,

然后您还需要在services.yaml中将自定义id生成器标记为doctrine id_generator

    VKollin\Doctrine\BackedEnumFields\IdGenerator\EnumIdGenerator:
        class: VKollin\Doctrine\BackedEnumFields\IdGenerator\EnumIdGenerator
        tags: [ 'doctrine.id_generator' ]

在其他使用Doctrine的项目中

use App\Entity\StatusEnum;
use BenTools\Doctrine\NativeEnums\Type\NativeEnum;
use Doctrine\DBAL\Types\Type;

NativeEnum::registerEnumType(StatusEnum::class);
// NativeEnum::registerEnumType('status', StatusEnum::class); // Alternatively, if you want your type to be named "status"

许可证

MIT。

Ceterum censeo Doctrinam esse delendam