Это возможно в Symfony Serializer
десериализовать массив объектов в свойстве? у меня есть Boss
класс с $Npc = []
свойство, которое должно содержать массив Npc
объекты. Я видел некоторые примеры в документации, но они не описывают эту функцию. У меня есть строка JSON с массивом NPC, например:
class Boss {
private $Npc = [];
/**
* @return Npc[]
*/
public function getNpcs(): array
{
return $this->npcs;
}
}
Я использую php7.1 и symfony / serializer версии ^ 3.3.
Редактировать:
Я уже пробовал PhpDocExtractor, но он не позволил мне установить его. 🙁
Редактировать:
Это возможное значение JSON:
{
"bossname": "Epic boss!",
"npcs": [{
"id": 24723,
"name": "Selin Fireheart",
"urlSlug": "selin-fireheart",
"creatureDisplayId": 22642
}]
}
Я нашел способ сделать это :). Я установил пакет Symfony PropertyAccess через Composer. С помощью этого пакета вы можете добавлять сумматоры, съемники и хасеры. Таким образом, Symfony Serializer автоматически заполнит массив правильными объектами.
Пример:
private $npcs = [];
public function addNpc(Npc $npc): void
{
$this->npcs[] = $npc;
}
public function hasNpcs(): bool
{
return count($this->npcs) > 0
}
и т.п.
Таким образом, вы можете использовать ObjectNormalizer с:
$normalizer = new ObjectNormalizer(null, null, null, new ReflectionExtractor());
Я боролся с этим много часов без результата.
Каждый раз, когда я добавлял функцию сумматора, объектный нормализатор хотел вызвать эту функцию, но получал сообщение об ошибке типа «Поле xyz должно иметь тип xyz [], задан массив».
Это потому, что я забыл добавить arraynormalizer в пул нормализатора сериализатора. После добавления все работало нормально.
Надеюсь, это полезно для кого-то.
Да, вы можете десериализовать массив, но вам нужно предоставить для второго параметра объект, а также информацию, что это на самом деле массив. Вы можете сделать это так:
use Symfony\Component\Serializer\Serializer;
class Boss {
private $Npc = [];
/**
* @return Npc[]
*/
public function getNpcs(): array
{
return $serializer->deserialize($this->npcs, 'Acme\Npc[]', 'json');
}
}
Вы можете найти больше информации об этом в документации по обработка массивов