<?php
namespace App\Services\CommerceML\Serializer\Normalizer;
use App\Services\CommerceML\Dto\GroupDto;
use Symfony\Component\Serializer\Normalizer\{DenormalizerAwareInterface, DenormalizerAwareTrait, DenormalizerInterface};
class GroupDenormalizer implements DenormalizerInterface, DenormalizerAwareInterface
{
use DenormalizerAwareTrait;
public function denormalize($data, string $type, string $format = null, array $context = [])
{
// По какой-то причине если дочерняя группа одна - она не оборачивается в массив
if(array_key_exists('Группы', $data)) {
$data['Группы']['Группа'] = (array_key_exists('Ид',$data['Группы']['Группа']))
? [$data['Группы']['Группа']]
: $data['Группы']['Группа'];
}
$childrens = array_key_exists('Группы', $data) ? array_map(fn($children) => $this->denormalizer->denormalize($children, GroupDto::class), $data['Группы']['Группа']) : null;
return new GroupDto(
id: $data['Ид'] ?? null,
name: $data['Наименование'] ?? null,
childrens: $childrens,
);
return $data;
}
public function supportsDenormalization($data, string $type, string $format = null)
{
return $type === GroupDto::class;
}
}
$classMetadataFactory = new ClassMetadataFactory(new AnnotationLoader(new AnnotationReader()));
$extractor = new PropertyInfoExtractor([], [new PhpDocExtractor(), new ReflectionExtractor()]);
$metadataAwareNameConverter = new MetadataAwareNameConverter($classMetadataFactory);
$encoders = [new XmlEncoder()];
$normalizers = [
new GroupDenormalizer(),
new ArrayDenormalizer(),
new ObjectNormalizer($classMetadataFactory, $metadataAwareNameConverter, null ,$extractor)
];
$this->serializer = new Serializer($normalizers, $encoders);
foreach ($xmlGroups->Группа as $group) {
$groups->push(
$this->serializer->deserialize($group->asXML(), GroupDto::class, 'xml', ['flatten_nested_attributes' => true])
);
}
$xmlGroups->Группа
это нода, получаемая из парсинга с помощью SimpleXml. @var GroupDto[]
перед public array $childrens = [];
, то в это поле попадет чистый массив без преобразований, но вот его вид скорее всего и является причиной, почему у меня мой код отрабатывает не так, как я ожидаю:0 => App\Services\CommerceML\Dto\GroupDto {#841 ▼
#exceptKeys: []
#onlyKeys: []
+id: "58a742d8-dcc4-11ec-9656-fa163ec2d0ed"
+name: "Ковры"
+childrens: array:1 [▼
"Группа" => array:2 [▼
0 => array:3 [▶]
1 => array:2 [▶]
]
]
}
"Группа" => Array()
. Не знаю почему SimpleXml парсит CommerceMl именно так, но видимо в $childrens
поле мне нужно передавать не условный $array
, а $array['Группы']
. public function setChildrens(array $childrens): void
{
$this->childrens = $childrens;
}
^ App\Services\CommerceML\Dto\GroupDto {#628 ▼
#exceptKeys: []
#onlyKeys: []
+id: "58a742d8-dcc4-11ec-9656-fa163ec2d0ed"
+name: "Ковры"
+childrens: array:1 [▼
0 => App\Services\CommerceML\Dto\GroupDto {#663 ▼
#exceptKeys: []
#onlyKeys: []
+id: ""
+name: ""
+childrens: []
}
]
}
......
use \VK\Client\VKApiClient;
........
public function loginVK(Request $request) {
$vk = new VKApiClient('5.95');
echo 'test';
}