【问题标题】:How can I convert plain nested array to collection of entity objects?如何将普通嵌套数组转换为实体对象集合?
【发布时间】:2020-01-14 06:42:31
【问题描述】:

我有一个 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。请按原样处理。

【问题讨论】:

  • 数组到底是从哪里来的?您说数据是通过 api 传输的,这意味着它已经序列化。无论如何,我从数据库查询中获取数组数据,然后通常使用 fromArray 类型的方法来填充实体。
  • 还有更多参数发送,比如订单的 ID 和安全性的哈希值。这一切都是 json_decoded,所以我把它作为数组。不管它是如何到达那里的,这就是我必须使用的:)

标签: php symfony serialization normalization


【解决方案1】:

从原始 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;
}

【讨论】:

  • 这解决了我的问题,我建议编辑您的答案,以便首先使用批量解决方案
  • 好的,谢谢,我会这样做的。我这样说是因为它似乎更直接地解决了您的问题,但我确实相信直接使用序列化程序和原始输入这样做是一种更好的方法;如果您同意,我将反转答案块。
  • 我只是不知道你可以一次完成一个完整的数组,所以我从来没有想过:)
猜你喜欢
  • 2014-03-24
  • 2021-07-07
  • 2021-05-28
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
  • 2019-10-23
  • 2020-07-03
  • 1970-01-01
相关资源
最近更新 更多