Symfony 4 - Сериализация VichUploader «Symfony\Component\HttpFoundation\File\File» не разрешена

У меня есть проект Symfony 4 с сущностью «FeuilleConge» (с VichUploader), а также сущностью «Пользователь» и сущностью «Отсутствие» в связи с сущностью «FeuilleConge».

Когда я отправляю сообщение об отсутствии, я также сохраняю «FeuilleConge» в моем User->getFeuilleConge().

Но когда я отправляю сообщение об отсутствии (с сущностью FeuilleConge), у меня возникает эта ошибка:

Сериализация Symfony\Component\HttpFoundation\File\File не разрешена.

Я попытался добавить методы serialize() и unserialize() к своим объектам FeuilleConge и Absence, например:

Отсутствие.php:

/**
 * @ORM\Entity(repositoryClass="App\Repository\AbsenceRepository")
 * @ORM\HasLifecycleCallbacks()
 * @Vich\Uploadable
 */
class Absence
{

    /**
     * @ORM\ManyToOne(targetEntity="App\Entity\FeuilleConge", inversedBy="absences", cascade={"persist", "remove"})
     */
    private $feuilleConge;

    /** @see \Serializable::serialize() */
    public function serialize()
    {
        return serialize(array(
            $this->id,

        ));
    }

    /** @see \Serializable::unserialize() */
    public function unserialize($serialized)
    {
        list(
            $this->id,

        ) = unserialize($serialized);
    }

}

FeuilleConge.php:

<?php

namespace App\Entity;

use Serializable;
use Doctrine\ORM\Mapping as ORM;
use Doctrine\Common\Collections\Collection;
use Symfony\Component\HttpFoundation\File\File;
use Doctrine\Common\Collections\ArrayCollection;
use Vich\UploaderBundle\Mapping\Annotation as Vich;
use Vich\UploaderBundle\Mapping\Annotation\Uploadable;
use Symfony\Component\HttpFoundation\File\UploadedFile;

/**
 * @ORM\Entity(repositoryClass="App\Repository\FeuilleCongeRepository")
 * @Vich\Uploadable
 */
class FeuilleConge
{
    /**
     * @ORM\Id()
     * @ORM\GeneratedValue()
     * @ORM\Column(type="integer")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="feuilleCongeName", type="string", length=255, nullable=true)
     */
    private $feuilleCongeName;

    /**
     * @Vich\UploadableField(mapping="feuillesConge", fileNameProperty="feuilleCongeName")
     * @var File
     */
    private $feuilleCongeFile;

    /**
     * @ORM\Column(type="datetime", nullable=true)
     * @var \DateTime
     */
    private $updatedAt;

    /**
     * @ORM\OneToOne(targetEntity="App\Entity\User", mappedBy="feuilleConge", cascade={"persist", "remove"})
     */
    private $user;

    /**
     * @ORM\OneToMany(targetEntity="App\Entity\Absence", mappedBy="feuilleConge")
     */
    private $absences;

    public function __construct()
    {
        $this->absences = new ArrayCollection();
    }

    public function getId(): ?int
    {
        return $this->id;
    }


    /**
     * @param File|UploadedFile $feuilleConge
     *
     * @return FeuilleConge
     */
    public function setFeuilleCongeFile(File $feuilleCongeFile = null)
    {
        $this->feuilleCongeFile = $feuilleCongeFile;

        if ($feuilleCongeFile) {
            $this->updatedAt = new \DateTimeImmutable();
        }

        return $this;
    }

    /**
     * @return File|null
     */
    public function getFeuilleCongeFile()
    {
        return $this->feuilleCongeFile;
    }


    /**
     * Set urlPaquet
     *
     * @param string $urlPaquet
     *
     * @return FeuilleConge
     */
    public function setFeuilleCongeName($feuilleCongeName)
    {
        $this->feuilleCongeName = $feuilleCongeName;

        return $this;
    }

    /**
     * Get urlPaquet
     *
     * @return string|null
     */
    public function getFeuilleCongeName()
    {
        return $this->feuilleCongeName;
    }

    /**
     * Set updatedAt
     *
     * @param \DateTime $updatedAt
     *
     * @return FeuilleConge
     */
    public function setUpdatedAt($updatedAt)
    {
        $this->updatedAt = $updatedAt;

        return $this;
    }

    /**
     * Get updatedAt
     *
     * @return \DateTime
     */
    public function getUpdatedAt()
    {
        return $this->updatedAt;
    }

    public function getUser(): ?User
    {
        return $this->user;
    }

    public function setUser(?User $user): self
    {
        $this->user = $user;

        // set (or unset) the owning side of the relation if necessary
        $newFeuilleConge = $user === null ? null : $this;
        if ($newFeuilleConge !== $user->getFeuilleConge()) {
            $user->setFeuilleConge($newFeuilleConge);
        }

        return $this;
    }

    /**
     * @return Collection|Absence[]
     */
    public function getAbsences(): Collection
    {
        return $this->absences;
    }

    public function addAbsence(Absence $absence): self
    {
        if (!$this->absences->contains($absence)) {
            $this->absences[] = $absence;
            $absence->setFeuilleConge($this);
        }

        return $this;
    }

    public function removeAbsence(Absence $absence): self
    {
        if ($this->absences->contains($absence)) {
            $this->absences->removeElement($absence);
            // set the owning side to null (unless already changed)
            if ($absence->getFeuilleConge() === $this) {
                $absence->setFeuilleConge(null);
            }
        }

        return $this;
    }

    /** @see \Serializable::serialize() */
    public function serialize()
    {
        return serialize(array(
            $this->id,
            $this->feuilleCongeName,

        ));
    }

    /** @see \Serializable::unserialize() */
    public function unserialize($serialized)
    {
        list(
            $this->id,

        ) = unserialize($serialized);
    }
}

Я добавил те же методы в свой объект User. Но проблема та же.

Может кто-то помочь мне, пожалуйста ?


person kiuega    schedule 08.09.2019    source источник
comment
Никто не поможет мне, пожалуйста?   -  person kiuega    schedule 09.09.2019


Ответы (1)


Вам нужно добавить методы сериализации в свой класс User, так как ваша проблема связана с тем, что Symfony пытается его сериализовать. Затем ваш класс Absence сериализуется только потому, что Symfony пытается сериализовать весь объект User (чего вам следует избегать)

person Massimiliano Arione    schedule 17.08.2020