【问题标题】:Converting JSON to Doctrine Entity in Symfony在 Symfony 中将 JSON 转换为 Doctrine 实体
【发布时间】:2016-06-18 21:54:36
【问题描述】:

我目前正在使用 Symfony 框架构建 API。我已经完成了足够的阅读以了解如何使用序列化组件,并为我的实体构建了一些自定义规范化器。它目前的工作方式是:

JSON -> 数组(解码)-> 用户实体(非规范化)

只要请求内容是用户的 JSON 表示,这就是有效的查找,例如:

{
  "email": "demouser@email.com",
  "plainPassword": "demouser",
  "first_name" : "Demo",
  "last_name" : "User"
}

在我的控制器中使用以下代码创建用户实体:

    $newuser = $this->get('api.serializer.default')->deserialize($request->getContent(), WebsiteUser::class, 'json');

但是,我想将用户 JSON 嵌套在 JSON 对象的“数据”属性中,这将允许消费者在请求中传递额外的元数据,例如:

{
  "options": [
    {
      "foo": "bar"
    }
  ],
  "data": [
    {
      "email": "demouser@email.com",
      "plainPassword": "demouser",
      "first_name": "Demo",
      "last_name": "User"
    }
  ]
}

这导致的主要问题是反序列化不成功,因为 JSON 格式发生了变化。

到目前为止,我考虑的唯一解决方案是 json_decode 整个请求正文,获取该数组的“数据”元素,并将数据元素的内容传递给反规范化器(而不是反序列化器)。

有没有更好的方法来解决这个问题?

【问题讨论】:

    标签: php json symfony doctrine


    【解决方案1】:

    您应该能够获得请求正文的特定密钥,如下所示:

    $newuser = $this->get('api.serializer.default')->deserialize(
        $request->request->get('data'), WebsiteUser::class, 'json'
    );
    

    如果您在不解码请求正文的情况下无法从键中检索数据,请查看this bundle,它仅包含一个 EventListener,它在解码后替换请求正文。

    您可以轻松地将相同的逻辑集成到您的应用程序中,或者直接需要捆绑包(效果很好)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-03-23
      • 2014-05-28
      • 1970-01-01
      • 1970-01-01
      • 2011-10-06
      • 2011-08-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多