返回

如何使用非 ID 字段作为 Doctrine 实体上的 ApiResource 标识符?

php

使用非 ID 字段作为 Doctrine 实体上的 ApiResource 标识符

问题

在使用 API Platform 和 Symfony 时,Doctrine 实体的 ID 通常用作 ApiResource 的标识符。然而,在某些情况下,可能需要使用非 ID 字段作为标识符。本文将指导你如何实现这一目标。

解决方法

步骤 1:创建非 ID 字段

首先,你需要创建一个非 ID 字段,并将其用作标识符。在本例中,我们使用了一个名为 $uuid 的字段。

步骤 2:设置 ApiProperty 注解

接下来,你需要使用 ApiProperty 注解将 $uuid 字段标记为标识符,并取消标记 $id 字段。

步骤 3:更新 ApiResource 配置

在 ApiResource 配置中,你需要指定新的标识符字段。

优点

  • 使你能够在 API 中以更加用户友好的方式标识资源。
  • 避免更改实体的主键。

代码示例

#[ORM\Entity]
#[ORM\Table('poll')]
#[ORM\InheritanceType('SINGLE_TABLE')]
#[ORM\HasLifecycleCallbacks]
abstract class Poll
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    #[ApiProperty(identifier: false)]
    private ?int $id = null;

    #[ORM\Column(type: UuidType::NAME, unique: true)]
    #[Groups(['poll:read'])]
    #[ApiProperty(identifier: true)]
    private Uuid $uuid;

    #[ORM\PrePersist]
    public function createUuid(): void
    {
        $this->uuid = Uuid::v7();
    }
}

常见问题解答

1. 为什么需要使用非 ID 字段作为标识符?

  • 可能存在业务用例,其中非 ID 字段更适合用作标识符,例如使用 UUID 作为更用户友好的 ID。

2. 如何指定新的标识符字段?

  • 在 ApiResource 配置中使用 ApiProperty(identifier: true) 注解。

3. 是否需要更改实体的主键?

  • 不需要,这不会更改实体的主键。

4. 这种方法是否适用于所有数据库系统?

  • 是的,此方法适用于使用 Doctrine 作为 ORM 的所有数据库系统。

5. 使用非 ID 字段作为标识符有哪些注意事项?

  • 确保非 ID 字段唯一且不可变。