Пользовательское имя получателя платформы API для атрибутов сущности

#php #symfony #doctrine-orm #api-platform.com

#php #symfony #doctrine-orm #api-platform.com

Вопрос:

У меня есть объект Doctrine, который я хочу отобразить в ресурс платформы Api:

 /**
 * @ApiResource
 * @ORMEntity
 */
class Book
{
    /**
     * @ORMId
     * @ORMColumn(type="uuid", unique=true)
     */
    private UuidInterface $uuid;

    /**
     * @var string
     * @ORMColumn
     * @AssertNotBlank
     */
    private string $title;

    /**
     * @ORMColumn(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 для всех атрибутов:

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

Но тогда поля не отображаются на моей странице платформы API. Как я могу настроить API Platform / Doctrine / Symfony или что-то еще, чтобы я мог использовать пользовательские имена для своих получателей?

Ответ №1:

Изменяя эти имена методов, доступ к свойствам Symfony не распознает их как фактические средства получения и будет включен сериализатором, их можно открыть с помощью групп сериализации.

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

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

}
  

Однако ваши методы не будут рассматриваться как средства получения, поэтому это может вызвать некоторые странности с сериализатором или платформой Api. Это стандартное соглашение, которое лучше не менять. За кулисами это обрабатывается компонентом доступа к свойствам Symfony.

Комментарии:

1. На самом деле, ваше решение не сработало для меня: Groups on "AdventureBookDomainBookBook::uuid" cannot be added. Groups can only be added on methods beginning with "get", "is", "has" or "set". однако это сообщение об ошибке вместе с вашим ответом убедило меня придерживаться стандартного именования геттера. Из-за этого помечено как принятое. Спасибо.

2. @Mochilo Обычно группы работают с методами, я думаю, это потому, что ваше свойство и методы используют одно и то же имя?