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

时间:2019-09-12 11:33:52

标签: php symfony serialization normalization

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

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

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

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

我希望回到Contact类。目前,我可以通过序列化/反序列化来做到这一点,但我希望对此有更有效的方法:

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

这有效,并且$contact现在是Contact的实例。但是我必须一次性处理100个项目,甚至可能更多。

我正在考虑创建一个toObject()方法,该方法通过键来分配值,但这似乎并没有什么好处。

是否可以在不编写自己的逻辑或执行额外的序列化步骤的情况下完成此操作?

请注意:我获得了数据数组,我无法获得“原始” json。请按原样使用。

1 个答案:

答案 0 :(得分:1)

从原始JSON输入中反规范化

如果您从API获取信息,则可以取消JSON转换并直接处理输入,因为很有可能API不会向您发送本机数组,而是您将转换为JSON的JSON。在某个点上排列

串行器组件可以直接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;
}