Галерея пакетов Sonata Media Bundle платформы API — Циркулярный справочник

Новое в SF3, я использую API Platform и Sonata Media Bundle.

Я заблокирован при получении объекта галереи Sonata с помощью запроса API Platform GET.

"A circular reference has been detected when serializing the object of class \"Application\\Sonata\\MediaBundle\\Entity\\Gallery\" (configured limit: 1)"

Админка сущности прекрасно работает, я могу добавить галерею сущности. Когда у объекта есть галерея, это вызывает эту ошибку, когда нет, все в порядке.

Entity Technic GET /technics в платформе API

[
  {
    "id": 0,
    "type": "string",
    "comment": "string",
    "links": [
      "string"
    ],
    "gallery": "string"
  }
]

Класс сущности

<?php

// src/AppBundle/Entity/Technic.php

namespace AppBundle\Entity;

use ApiPlatform\Core\Annotation\ApiResource;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Serializer\Annotation\Groups;

/**
 * @ORM\Entity
 * @ApiResource
 */
class Technic
{
    /**
     * @var int The id of this evaluation.
     *
     * @ORM\Column(type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    public $id;

    /**
     * @var string $type TechnicType of the evaluation
     *
     * @ORM\OneToOne(targetEntity="TechnicType")
     * @Assert\NotBlank
     */
    public $type;

    /**
     * @var string $note Note of the evaluation
     *
     * @ORM\Column(type="string", length=255, nullable=true)
     */
    public $comment;

    /**
     * @var Link[] Link Links of this technic.
     *
     * @ORM\ManyToMany(targetEntity="Link", cascade={"persist"})
     */
    private $links;

    /**
     * @ORM\OneToOne(targetEntity="Application\Sonata\MediaBundle\Entity\Gallery",cascade={"persist"})
     * @ORM\JoinColumn(name="gallery", referencedColumnName="id", nullable=true)
     */
    private $gallery;

    /**
     * Constructor
     */
    public function __construct()
    {
        $this->links = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Get id
     *
     * @return integer
     */
    public function getId()
    {
        return $this->id;
    }

    /**
     * Set type
     *
     * @param \AppBundle\Entity\TechnicType $type
     *
     * @return Technic
     */
    public function setType(\AppBundle\Entity\TechnicType $type = null)
    {
        $this->type = $type;

        return $this;
    }

    /**
     * Get type
     *
     * @return \AppBundle\Entity\TechnicType
     */
    public function getType()
    {
        return $this->type;
    }

    /**
     * Add link
     *
     * @param \AppBundle\Entity\Link $link
     *
     * @return Technic
     */
    public function addLink(\AppBundle\Entity\Link $link)
    {
        $this->links[] = $link;

        return $this;
    }

    /**
     * Remove link
     *
     * @param \AppBundle\Entity\Link $link
     */
    public function removeLink(\AppBundle\Entity\Link $link)
    {
        $this->links->removeElement($link);
    }

    /**
     * Get links
     *
     * @return \Doctrine\Common\Collections\Collection
     */
    public function getLinks()
    {
        return $this->links;
    }

    /**
     * Set comment
     *
     * @param string $comment
     *
     * @return Technic
     */
    public function setComment($comment)
    {
        $this->comment = $comment;

        return $this;
    }

    /**
     * Get comment
     *
     * @return string
     */
    public function getComment()
    {
        return $this->comment;
    }

    /**
     * Set gallery
     *
     * @param \Application\Sonata\MediaBundle\Entity\Gallery $gallery
     *
     * @return Technic
     */
    public function setGallery(\Application\Sonata\MediaBundle\Entity\Gallery $gallery = null)
    {
        $this->gallery = $gallery;

        return $this;
    }

    /**
     * Get gallery
     *
     * @return \Application\Sonata\MediaBundle\Entity\Gallery
     */
    public function getGallery()
    {
        return $this->gallery;
    }
}

Большое спасибо, ребята, я в отчаянии, я пробую много вещей в StackQ/A, аннотациях, конфигурации seraliazer...


person Paul Leclerc    schedule 23.07.2017    source источник
comment
Это определенно похоже на не полностью настроенную конфигурацию сериализатора. Что вы пробовали?   -  person svgrafov    schedule 24.07.2017
comment
Привет, спасибо за ваше время. Я следил за всей документацией по установке и настройке при установке администратора сонаты и пакета мультимедиа. config.xml и другие заполняются, как упоминается в документации. Возможно, у него проблема в рассматриваемом комплекте.   -  person Paul Leclerc    schedule 24.07.2017


Ответы (1)


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

$normalizer = new GetSetMethodNormalizer();
$normalizer->setCircularReferenceHandler(function ($object) {
    return $object->getId();
});

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

person svgrafov    schedule 24.07.2017
comment
С использованием пакетов, которые сами используют специфические сериализаторы, я не думаю, что мне нужно управлять этим самостоятельно, но я буду копаться в конфигах. Наверняка проблема возникает из-за этого типа проблем, но я просто не понимаю, почему это не управляется пакетом. Возможно, это просто несовместимость API-платформы, как вы упомянули. Я также буду копаться с группой сериализаторов, чтобы получать только части данных, избегая кругового цикла, но это сложно с этим типом структуры пакета. ty Я буду действительным и скоро закончу ваш ответ. - person Paul Leclerc; 24.07.2017
comment
Я не говорил ни о какой несовместимости. Кстати, вы также можете найти хорошее применение групп сериализации при управлении доступом к определенным свойствам ваших сущностей. - person svgrafov; 24.07.2017