如何使用JMS Serializer和Symfony2实现模型侧载

时间:2014-03-07 21:57:42

标签: symfony serialization ember.js jmsserializerbundle jms-serializer

我正在构建一个项目,包括用于UI的Ember.js和Ember-data以及用于后端JSON API的Symfony2,FOSRestBundle和JMS Serializer。 JMS Serializer总是在其输出中嵌入嵌套模型,但是Ember-data requires that the models are side-loaded。我无法在任何地方找到将JMS Serializer配置为侧载模型而不是嵌入模型的示例。

当然,我可以write an adapter on the Ember-data side to transform the result,但我希望获得侧载数据的好处,而不仅仅是解决JMS Serializer中的(潜在)限制。

这就是嵌入式模型数据的意思,它是 JMS-Serializer现在所做的

{
  "post": {
    "id": 1,
    "name": "Test Post",
    "comments": [
      {
        "id": 1,
        "comment": "Awesome post, man!"
      }, {
        "id": 2,
        "comment": "Yeah, what he said."
      }
    ]
  }
}

这就是我所说的侧载模型数据,这是我想要的

{
  "post": {
    "id": 1,
    "name": "Test Post",
    "comments": [1, 2]
  },
  "comments": [
    {
      "id": 1,
      "comment": "Awesome post, man!"
    }, {
      "id": 2,
      "comment": "Yeah, what he said."
    }
  ]
}

有没有人知道一个配置来实现我想要的?或者是否有人在JMS-Serialiser中实现了此功能?

2 个答案:

答案 0 :(得分:4)

我已经实现了一个自定义JSON序列化访问者类,它将为嵌入对象侧载数据而不是内联编码。该课程可以是found on GitHub here

示例用法:

$visitor = new SideLoadJsonSerializationVisitor(
    new SerializedNameAnnotationStrategy(new CamelCaseNamingStrategy()));

$serializer = SerializerBuilder::create()
    ->setSerializationVisitor('json', $visitor)
    ->build();

echo $serializer->serialize(array('myClass' => $myClass), 'json');

或者您可以通过覆盖JSON序列化访问者类在Symfony2项目中使用它

parameters:
    jms_serializer.json_serialization_visitor.class: 'Acme\MyBundle\Serializer\SideLoadJsonSerializationVisitor'

答案 1 :(得分:1)

有一个捆绑包支持更多功能,如异步加载和一些更灵活的实现和安全功能。

https://github.com/UniqueLibs/ember-data-serializer-bundle