如何将普通嵌套数组转换为实体对象集合?

How can I convert plain nested array to collection of entity objects?

我有一个 PHP 普通数组,我需要将其转换为原始实体。示例:

class Contact
{
    protected $name;
    getName(){}
    setName(){}
}

这通过 API 来回发送,有时我将该联系人作为数组元素:

$example = ['name'=>'Foo Bar'];

我想把它作为 Contact class 返回。目前,我可以通过 serialize/deserialize 来做到这一点,但我希望有更有效的方法:

foreach($examples as $example) {
    $temp    = $this->serializer->serialize($example, 'json');
    $contact = $this->serializer->deserialize($temp, Contact::class, 'json');
}

这有效,$contact 现在是 Contact 的实例。但是我必须一次对 100 个项目执行此操作,可能更多。

我正在考虑创建一个 toObject() 方法,它通过键分配值,但这似乎并没有好多少。

有没有办法在不编写自己的逻辑或执行额外的序列化步骤的情况下完成此操作?

请注意:我得到数据数组,我无法得到 'raw' json。请接受 'as is'.

从原始 JSON 输入反规范化

如果您从 API 获取信息,您可能可以取消 JSON 转换并直接处理输入,因为 API 很可能不是向您发送一个本机数组,但是 JSON 您在某个时候转换为数组

Serializer 组件可以直接handle arrays as well

假设输入 JSON 像这样:

$data = '[
   {
     "name": "Mary"
   },
   {
     "name": "Jane",
   },
   {
     "name": "Alice"
   }
]';

您可以调用 deserialize() 表示您希望输入数据中有 Contact[]

$contacts = $serializer->deserialize($data, Contact::class . '[]', 'json');

这将一步完成 Contact 数组。


从数组到对象的反规范化

如果由于某种原因原始输入不可用或不容易反序列化,并且您确实需要一个一个地从数组转换为对象,并且您的对象具有您在问题中显示的设置器;您可以简单地使用 GetSetMethodNormalizer(Serializer 组件内部使用的标准化器之一)。

例如:

$contacts = [
  ['name' => 'Mary'],
  ['name' => 'Jane'],
  ['name' => 'Alice'],
];

$normalizer = new GetSetMethodNormalizer();
foreach($contacts as $arrayContact){
    $contact = $normalizer->denormalize(Contact::class, $arrayContact);
    // do something with $contact;
}