API 平台自定义 getter 实体属性的名称

API Platform custom getter name for Entity attributes

我有一个要映射到 Api 平台资源的 Doctrine 实体:

/**
 * @ApiResource
 * @ORM\Entity
 */
class Book
{
    /**
     * @ORM\Id
     * @ORM\Column(type="uuid", unique=true)
     */
    private UuidInterface $uuid;

    /**
     * @var string
     * @ORM\Column
     * @Assert\NotBlank
     */
    private string $title;

    /**
     * @ORM\Column(type="datetime")
     */
    private DateTimeInterface $createdAt;

    public function __construct(UuidInterface $uuid, string $title, DateTimeInterface $createdAt)
    {
        $this->uuid = $uuid;
        $this->title = $title;
        $this->createdAt = $createdAt;
    }

    public function getUuid(): string
    {
        return $this->uuid->toString();
    }

    public function getTitle(): string
    {
        return $this->title;
    }

    public function getCreatedAt(): string
    {
        return $this->createdAt->format('Y-m-d H:i:s');
    }
}

在我的api的相应资源上正常显示:

我现在要做的是对所有属性使用不带 get 前缀的自定义 getter 名称:

    public function uuid(): string;
    public function title(): string;
    public function createdAt(): string;

但是我的 API 平台页面上没有显示这些字段。我如何配置 API Platform/Doctrine/Symfony 或其他什么以便我可以为我的 getter 使用自定义名称?

通过更改这些方法名称,Symfony 的 属性 访问不会将它们识别为实际的 getter,并且会被序列化程序忽略,可以使用序列化组公开它们。

/**
 * @ApiResource(
 *     normalizationContext={"groups"={"book"}}
 * )
 */
class Book
{

    /**
    * @Groups("book")
    */
    public function uuid(): string
    {
       //...
    }

}

但是,您的方法不会被视为 getter,因此它可能会导致序列化程序或 Api 平台出现一些异常情况。这是一个标准约定,最好不要更改它们。在幕后,这是由 Symfony 的 property access 组件处理的。