Части моих объектов API не отображаются в его схеме

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