У меня есть две сущности: Acquistion и priceHistory. у них есть отношение "многие ко многим", как показано ниже:
Aquisition.php
....
/**
* @ORM\ManyToMany(targetEntity = "App\Entity\PriceHistory", inversedBy = "acquisitions")
* @MaxDepth(1)
*/
private $services;
public function __construct()
{
$this->services = new ArrayCollection();
....
}
/**
* @return Collection|ServicePrice[]
*/
public function getServices(): Collection
{
return $this->services;
}
public function addService(ServicePrice $service): self
{
if (!$this->services->contains($service)) {
$this->services[] = $service;
}
return $this;
}
public function removeService(ServicePrice $service): self
{
if ($this->services->contains($service)) {
$this->services->removeElement($service);
}
return $this;
}
PriceHistory.php
/**
* @ORM\ManyToMany(targetEntity = "App\Entity\Acquisition", mappedBy = "services")
*/
private $acquisitions;
public function __construct(){
$this->acquisitions = new ArrayCollection();
}
/**
* @return Collection|Acquisition[]
*/
public function getAcquisitions(): Collection
{
return $this->acquisitions;
}
public function addAcquisition(Acquisition $acquisition): self
{
if (!$this->acquisitions->contains($acquisition)) {
$this->acquisitions[] = $acquisition;
$acquisition->addService($this);
}
return $this;
}
public function removeAcquisition(Acquisition $acquisition): self
{
if ($this->acquisitions->contains($acquisition)) {
$this->acquisitions->removeElement($acquisition);
$acquisition->removeService($this);
}
return $this;
}
Он работает нормально, схема правильно создана, сущности сохраняются и т. д.
Но я хочу сериализовать и десериализовать объект Acquiisition следующим образом:
$encoders = array(new JsonEncoder());
$objectNormalizer = new ObjectNormalizer();
$objectNormalizer->setCircularReferenceHandler(function ($object) {
return $object->getId();
});
$normalizers = array(new DateTimeNormalizer(), $objectNormalizer);
$serializer = new Serializer($normalizers, $encoders);
$tempCart = new Acquisition();
$service_prices = $this->getDoctrine()->getRepository(ServicePrice::class)->findAll()[0];
$tempCart->addService($service_prices);
$jsonContent = $serializer->serialize($tempCart, 'json');
Это дает мне следующую ошибку:
Type error: Return value of App\Entity\PriceHistory::getAcquisitions() must be an instance of Doctrine\Common\Collections\ArrayCollection, instance of Doctrine\ORM\PersistentCollection returned
Как я могу это исправить?
Большое спасибо за помощь.
Пьер





В вашем методе getAcquisitions() указан неверный тип возвращаемого значения, это должен быть Collection (который реализует ArrayCollection).
Чего я не понимаю, так это того, что объект Acquisition $ tempCart создан, и только когда я его сериализую, я получил ошибку.
Возможно, это не так на STackoverflow, но я публикую свое исследование по крупицам. Я считаю, что @MaxDepth (1) ИЛИ setCircularReferenceHandler () принимаются во внимание ... Но я не знаю почему.
@ 123pierre Попробуйте воссоздать прокси, возможно, они не обновлялись после изменения подсказки типа возвращаемого значения. Кроме этого, невозможно получить такую же ошибку IMO
Лично я отказываюсь от сложной сериализации объекта Doctrine. Либо слишком сложно (для меня), либо не готово ... :-( Честно говоря, на сериализацию через старую школу с циклами foreach уйдет гораздо меньше времени ...
Можешь попробовать,
/**
* @ORM\ManyToMany(targetEntity = "App\Entity\Acquisition", mappedBy = "services")
*
* @ORM\JoinTable(name = "relation_table_name")
*
*/
private $acquisitions;
БОЛЬШОЙ Извините за введение в заблуждение. Оригинал является коллекционной подсказкой. Я поставил Array Collection, чтобы попробовать этот способ ... Так что даже со сбором я получаю эту ошибку !! Я отредактировал свой пост