У меня есть XML в формате
<POS>
<Source PseudoCCode="BOA" ISOCountry="US" AgentDutyCode="J114N">
<RequestorID Type="11" ID="T921">
<CompanyName Code="CP" CodeContext="123T"/>
</RequestorID>
</Source>
<Source>
<RequestorID Type="1" ID="34778"/>
</Source>
<Source>
<RequestorID Type="9" ID="ZF"/>
</Source>
<Source>
<RequestorID Type="17" ID="mabaan"/>
</Source>
</POS>
`
У меня есть объект php, в который я хочу десериализоваться.
class POS
{
/**
* @ORM\OneToMany(targetEntity="POS_Source", mappedBy="POS", orphanRemoval=true)
* @Groups("Include")
*/
private $Source;
public function __construct()
{
$this->Source = new ArrayCollection();
}
/**
* @return ArrayCollection|OTA_POS_Source[]
*/
public function getSource(): ArrayCollection
{
return $this->Source;
}
public function addSource(POS_Source $source): self
{
if (!$this->Source->contains($source)) {
$this->Source[] = $source;
$source->setPOS($this);
}
return $this;
}
public function removeSource(POS_Source $source): self
{
if ($this->Source->contains($source)) {
$this->Source->removeElement($source);
// set the owning side to null (unless already changed)
if ($source->getPOS() === $this) {
$source->setPOS(null);
}
}
return $this;
}
Когда я делаю
$classMetadataFactory = new ClassMetadataFactory(
new AnnotationLoader(new AnnotationReader())
);
$metadataAwareNameConverter = new MetadataAwareNameConverter($classMetadataFactory);
$normalizers = [new DateTimeNormalizer(), new ArrayDenormalizer(),
new PropertyNormalizer(), new ObjectNormalizer($classMetadataFactory, $metadataAwareNameConverter)];
$encoders = [new XmlEncoder(), new JsonEncoder()];
$serializer = new Serializer($normalizers, $encoders);
$encoder = new XmlEncoder();
$output[] = $encoder->decode($data,'xml');
dump($output);
/**
* @var OTA_POS $pos
*/
$pos = $serializer->deserialize($data,POS::class,'xml');
$posSourceArray = $serializer->deserialize($pos->getSource(),'App\POS_Source[]','xml');
dump($posSourceArray);
Он дает мне POS-объект, но вместо набора объектов POS_Source он дает массив ниже.
POS {#839 ▼
-id: null
-Source: array:5 [▼
0 => array:4 [▶]
1 => array:1 [▶]
2 => array:1 [▶]
3 => array:1 [▶]
4 => array:1 [▶]
]
}
Как я могу заставить эту работу заполнять дерево объектов до самого дна. Когда я сериализую из структуры объекта в XML, он прекрасно работает.