#symfony #doctrine-orm #schema #swagger-ui #api-platform.com
Вопрос:
Некоторые части моих ресурсов API не отображаются в разделе Схемы.
Я вижу строки, которые я создал в файлах сущностей, и я вижу строки в таблицах MySQL, но в созданных схемах.
В поисках более простых проблем в Интернете я нашел группы сериализации, но я не уверен, что это решение. https://api-platform.com/docs/core/subresources/#using-serialization-groups
namespace AppEntity;
use ApiPlatformCoreAnnotationApiResource;
use AppRepositoryProductRepository;
use DoctrineCommonCollectionsArrayCollection;
use DoctrineCommonCollectionsCollection;
use DoctrineORMMapping as ORM;
/**
* @ApiResource()
* @ORMEntity(repositoryClass=ProductRepository::class)
*/
class Product
{
/**
* @ORMId
* @ORMGeneratedValue
* @ORMColumn(type="integer")
*/
private $id;
/**
* @ORMColumn(type="string", length=255)
*/
private $title;
/**
* @ORMColumn(type="string", length=255, nullable=true)
*/
private $shortDescription;
/**
* @ORMColumn(type="text", nullable=true)
*/
private $description;
/**
* @ORMColumn(type="text", nullable=true)
*/
private $content;
/**
* @ORMColumn(type="string", length=255, nullable=true)
*/
private $sku;
/**
* @ORMColumn(type="boolean")
*/
private $live;
/**
* @ORMManyToMany(targetEntity=Category::class, mappedBy="products")
*/
private $categories;
/**
* @ORMOneToMany(targetEntity=Attributes::class, mappedBy="product", orphanRemoval=true)
*/
private $attributes;
public function __construct()
{
$this->categories = new ArrayCollection();
$this->attributes = new ArrayCollection();
}
public function getId(): ?int
{
return $this->id;
}
public function getTitle(): ?string
{
return $this->title;
}
public function setTitle(string $title): self
{
$this->title = $title;
return $this;
}
public function getShortDescription(): ?string
{
return $this->shortDescription;
}
public function setShortDescription(?string $shortDescription): self
{
$this->shortDescription = $shortDescription;
return $this;
}
public function getDescription(): ?string
{
return $this->description;
}
public function setDescription(?string $description): self
{
$this->description = $description;
return $this;
}
public function getContent(): ?string
{
return $this->content;
}
public function setContent(?string $content): self
{
$this->content = $content;
return $this;
}
public function getSku(): ?string
{
return $this->sku;
}
public function setSku(?string $sku): self
{
$this->sku = $sku;
return $this;
}
public function getLive(): ?bool
{
return $this->live;
}
public function setLive(bool $live): self
{
$this->live = $live;
return $this;
}
/**
* @return Collection|Category[]
*/
public function getCategories(): Collection
{
return $this->categories;
}
public function addCategory(Category $category): self
{
if (!$this->categories->contains($category)) {
$this->categories[] = $category;
$category->addProduct($this);
}
return $this;
}
public function removeCategory(Category $category): self
{
if ($this->categories->removeElement($category)) {
$category->removeProduct($this);
}
return $this;
}
/**
* @return Collection|Attributes[]
*/
public function getAttributes(): Collection
{
return $this->attributes;
}
public function addAttribute(Attributes $attribute): self
{
if (!$this->attributes->contains($attribute)) {
$this->attributes[] = $attribute;
$attribute->setProduct($this);
}
return $this;
}
public function removeAttribute(Attributes $attribute): self
{
if ($this->attributes->removeElement($attribute)) {
// set the owning side to null (unless already changed)
if ($attribute->getProduct() === $this) {
$attribute->setProduct(null);
}
}
return $this;
}
}
Вот схема, которую он сгенерировал.
"Product": {
"type": "object",
"description": "",
"properties": {
"id": {
"readOnly": true,
"type": "integer"
},
"description": {
"type": "string",
"nullable": true
},
"shortDescription": {
"type": "string",
"nullable": true
},
"content": {
"type": "string",
"nullable": true
},
"sku": {
"type": "string",
"nullable": true
},
"live": {
"type": "boolean"
},
"categories": {
"type": "array",
"items": {
"type": "string",
"format": "iri-reference"
}
}
}
},
Комментарии:
1. Вы не описываете, какие поля должны быть в вашем API. Должна ли платформа API включать все поля? Я думаю, вам следует изучить группы сериализаторов. Это лучший способ контролировать, какие поля отображаются. И также важно: как обрабатываются отношения, иначе у вас возникнут проблемы с циклическими ссылками.