API-платформа - Виртуальная собственность - Денормализация коллекций

У меня есть объект Reservation, который содержит некоторую коллекцию ReservationRev(isions). ReservationRev содержит коллекцию PersonStay.

В Reservation у меня есть виртуальная собственность personStays (getter, add, remove, setter).

Когда я пытаюсь выполнить резервирование POST с помощью personStays, я получаю сообщение об ошибке: денормализатор для коллекции не найден.

класс Бронирование

/**
 * @var Collection
 * @Doctrine\ORM\Mapping\OneToMany(
 *     targetEntity = "Zakjakub\OswisAccommodationBundle\Entity\ReservationRev",
 *     mappedBy = "container",
 *     cascade = {"all"},
 *     orphanRemoval=true
 * )
 */
protected $revisions;

public function __construct(Nameable $nameable, ...) {
    $this->revisions = new ArrayCollection();
    $this->addRevision(new ReservationRev($nameable));
    ...
}

final public function addPersonStay(?PersonStay $personStay): void
{
    if (!$this->getPersonStays()->contains($personStay)) {
        $newRevision = clone $this->getRevisionByDate();
        $newRevision->addPersonStay($personStay);
        $this->addRevision($newRevision);
    }
}

final public function getPersonStays(?\DateTime $dateTime = null): Collection
{
    return $this->getRevisionByDate($dateTime)->getPersonStays() ?? new ArrayCollection();
}

final public function removePersonStay(?PersonStay $personStay): void
{
    if ($this->getPersonStays()->contains($personStay)) {
        $newRevision = clone $this->getRevisionByDate();
        $newRevision->removePersonStay($personStay);
        $this->addRevision($newRevision);
    }
}

final public function setPersonStays(?Collection $personStays): void
{
    $newRevision = clone $this->getRevisionByDate();
    $newRevision->setPersonStays($personStays ?? new ArrayCollection());
    $this->addRevision($newRevision);
}

класс ReservationRev

/**
 * @var Collection
 * @Doctrine\ORM\Mapping\ManyToMany(
 *     targetEntity = "Zakjakub\OswisAccommodationBundle\Entity\PersonStay",
 *     inversedBy = "reservationRevisions",
 *     cascade = {"all"}
 * )
 * @Doctrine\ORM\Mapping\JoinTable(name = "accommodation_reservations_person_stays")
 */
protected $personStays;

/**
 * @var Reservation
 * @Doctrine\ORM\Mapping\ManyToOne(
 *     targetEntity = "Zakjakub\OswisAccommodationBundle\Entity\Reservation",
 *     inversedBy = "revisions"
 * )
 * @Doctrine\ORM\Mapping\JoinColumn(name = "container_id", referencedColumnName = "id")
 */
protected $container;

public function __construct(Nameable $nameable, ...) {
    $this->personStays = new ArrayCollection();
    ...
}

final public function addPersonStay(?PersonStay $personStay): void
{
    if ($personStay) {
        return;
    }
    if (!$this->personStays->contains($personStay)) {
        $this->personStays->add($personStay);
        $personStay->addReservationRevision($this);
    }
}

final public function removePersonStay(?PersonStay $personStay): void
{
    if ($personStay) {
        return;
    }
    if ($this->personStays->removeElement($personStay)) {
        $personStay->removeReservationRevision($this);
    }
}

final public function setPersonStays(Collection $personStays): void
{
    foreach ($this->personStays as $personStay) {
        if (!$personStays->contains($personStay)) {
            $this->removePersonStay($personStay);
        }
    }
    foreach ($personStays as $personStay) {
        if (!$this->personStays->contains($personStay)) {
            $this->addPersonStay($personStay);
        }
    }
}

/**
 * @return Collection
 */
final public function getPersonStays(): Collection
{
    return $this->personStays ?? new ArrayCollection();
}

класс PersonStay

/**
 * @var Person
 * @Doctrine\ORM\Mapping\ManyToOne(
 *     targetEntity = "Zakjakub\OswisAccommodationBundle\Entity\Person",
 *     inversedBy = "personStays",
 *     cascade = {"all"}
 * )
 * @Doctrine\ORM\Mapping\JoinColumn(name = "person_id", referencedColumnName = "id")
 */
protected $person;

/**
 * @var Collection
 * @Doctrine\ORM\Mapping\ManyToMany(
 *     targetEntity = "Zakjakub\OswisAccommodationBundle\Entity\ReservationRev",
 *     mappedBy = "personStays"
 * )
 */
protected $reservationRevisions;

/**
 * @var Room
 * @Doctrine\ORM\Mapping\ManyToOne(
 *     targetEntity = "Zakjakub\OswisAccommodationBundle\Entity\Room",
 *     inversedBy = "personStays",
 *     cascade = {"persist"}
 * )
 * @Doctrine\ORM\Mapping\JoinColumn(name = "room_id", referencedColumnName = "id")
 */
protected $room;

public function __construct(
    ?Person $person = null,
    ?ReservationRev $reservationRevision = null,
    ?Room $room = null,
    ...
) {
    $this->setPerson($person);
    $this->reservationRevisions = new ArrayCollection();
    $this->addReservationRevision($reservationRevision);
    $this->setRoom($room);
    ...
}

/**
 * @param ReservationRev|null $reservationRev
 */
final public function addReservationRevision(?ReservationRev $reservationRev): void
{
    if (!$reservationRev) {
        return;
    }
    if (!$this->reservationRevisions->contains($reservationRev)) {
        $this->reservationRevisions->add($reservationRev);
        $reservationRev->addPersonStay($this);
    }
}

/**
 * @return Person
 */
final public function getPerson(): ?Person
{
    return $this->person;
}

/**
 * Set person.
 *
 * @param Person|null $person
 */
final public function setPerson(?Person $person): void
{
    if (null !== $this->person) {
        $this->person->removePersonStay($this);
    }
    if ($person && $this->person !== $person) {
        $person->addPersonStay($this);
        $this->person = $person;
    }
}

/**
 * @return Room|null
 */
final public function getRoom(): ?Room
{
    return $this->room;
}

/**
 * @param Room|null $room
 */
final public function setRoom(?Room $room): void
{
    if (null !== $this->room) {
        $this->room->removePersonStay($this);
    }
    if ($room && $this->room !== $room) {
        $room->addPersonStay($this);
        $this->room = $room;
    }
}

/**
 * @return Collection
 */
final public function getReservationRevisions(): Collection
{
    return $this->reservationRevisions ?? new ArrayCollection();
}

/**
 * @param ReservationRev|null $reservationRev
 */
final public function removeReservationRevision(?ReservationRev $reservationRev): void
{
    if (!$reservationRev) {
        return;
    }
    if ($this->reservationRevisions->removeElement($reservationRev)) {
        $reservationRev->removePersonStay($this);
    }
}

ПОЧТА

{ "personStays": null (or [] or [<some person stays>]), "description": "string", "note": "string" }

Ошибка

Could not denormalize object of type Doctrine\\Common\\Collections\\Collection, no supporting normalizer found.

Симфони 4.2.2

API-платформа 2.3.6

В методе getPersonStays вы упомянули, что он возвращает Collection здесь -> : Collection. Измените его на ArrayCollection. И другие места тоже.

Eugene Ruban 26.01.2019 21:08
Return value of Zakjakub\OswisAccommodationBundle\Entity\Reservation::getPer‌​sonStays() must be an instance of Doctrine\Common\Collections\ArrayCollection, instance of Doctrine\ORM\PersistentCollection returned.
Jakub Zak 27.01.2019 13:33

проверьте этот ответ stackoverflow.com/a/44099807/6130313

Eugene Ruban 28.01.2019 14:23

Да, я знаю, как это исправить (у меня все время именно так, как написано в связанном ответе - с помощью интерфейса Коллекции). Но в вашем предыдущем ответе говорится, что я должен изменить его на ArrayCollection - это противоположно связанному ответу.

Jakub Zak 28.01.2019 18:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
4
1 020
0

Другие вопросы по теме