#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 Обычно группы работают с методами, я думаю, это потому, что ваше свойство и методы используют одно и то же имя?