JMSSerializerBundle和Symfony 2 - 将Doctrine / ODM输出到JSON文件

时间:2016-05-04 03:33:18

标签: php symfony fosuserbundle doctrine-odm jmsserializerbundle

我正在尝试检索所有记录并将其显示在JSON文件中。

我的当前函数检索属于特定用户的所有事件。

/**
 * create json files from doctrine/mongo
 * @Route("/createjson", name="createjson")
 */
public function createJson()
{
    // check user authentication
    $this->denyAccessUnlessGranted('ROLE_USER', null, 'Unable to access this page!');
    $dm = $this->get('doctrine_mongodb')->getManager();

    $repository = $dm->getRepository('AppBundle:Event');
    $events = $repository->findBy(array('user' => $this->getUser()));

    $serializer = SerializerBuilder::create()->build();
    $result = $serializer->deserialize($events, 'AppBundle\Document\Event', 'json');
    var_dump($result);
    exit;
}

这不起作用,因为传递给序列化程序的一些元素是数组格式。我得到的错误。

Warning: json_decode() expects parameter 1 to be string, array given
500 Internal Server Error - ContextErrorException

但是,如果我使用内置的Symfony Serializer,它可以正常工作:

    $serializer = $this->container->get('serializer');
    $reports = $serializer->serialize($events, 'json');
    return new Response($reports);

然而,要生成的JSON将与我的Document / Entity不同,因此我想/需要使用JMSSerializerBundle。

例如,记录如下所示:

[{
    "id": "572041b3288b560e5e00451c",
    "name": "Test",
    "date": "2016-04-27T05:25:00+1000",
    "enddate": "2016-04-30T11:55:00+1000",
    "location": {
        "name": "Sydney, NSW"
    },
    "key": {
        "id": "1g43g34g34g23f32g32G32gGSDF"
    },
    "user": {
        "id": "57203174288b560e5e0044da"
    }, ...
}]

但我只想显示(输出)到JSON

[{
    "id": "572041b3288b560e5e00451c",
    "name": "Test",
    "date": "2016-04-27T05:25:00+1000",
    "location": "Sydney, NSW"
}]

我该怎么做呢? JMSSerializerBundle在线没有太多文档。

编辑:我应该提到我正在查询的数据库集合与由FOSUserBundle管理的User集合有关系。我不确定这与我的问题有什么关系

1 个答案:

答案 0 :(得分:1)

您应该查看捆绑包的文档,可能您会找到更多信息 http://jmsyst.com/bundles/JMSSerializerBundle

http://jmsyst.com/libs/serializer/master/usage

您似乎使用了序列化程序的错误功能。在您的情况下,您似乎需要从用户对象获取json,因此您需要使用

$serializer = SerializerBuilder::create()->build();
$result = $serializer->serialize($events, 'AppBundle\Document\Event', 'json');

serialize($object):string:从对象中获取字符串

deserialize($string):object:从对象的表示中获取对象(json,xml ...)。