Symfony3 如何将查询结果以数组形式返回并转换为 JSON?

4

我有一个问题,无法将我的帖子数组返回为JSON,因为Symfony返回带有实体对象的数组。

这是我的代码:

public function indexAction()
{
    $em = $this->getDoctrine()->getManager();

    $posts = $em->getRepository('AppBundle:Post')->findAll();

    return $this->json($posts);
}

我使用 $this->json 来返回json数据,该功能是在sf3上添加的。但这是我的结果:
[
    {},
    {},
    {}
]

我想要加载我的文章。
附注:我知道可以使用查询构建器和toArray方法之类的东西,但是否有一种DRY的方法?谢谢。
2个回答

3

由于实体可以有多个边界、代理对象和相关实体,因此我个人更喜欢明确指定要序列化的内容,例如:

use JsonSerializable;

/**
 * @Entity
 */
class SomeEntity implements JsonSerializable
{
    /** @Column(length=50) */
    private $title;

    /** @Column(length=50) */
    private $text;

    public function jsonSerialize()
    {
        return array(
            'title' => $this->title,
            'text'  => $this->text,
        );
    }
}

然后,只需简单地使用json_encode($someEntityInstance);

您也可以使用JMSSerializerBundle来实现DRY。

此外,您还可以选择编写自己的序列化程序来规范化数据。

更新:

如果您想要JSON的多个表示,可以按照以下方式实现:

use JsonSerializable;

/**
 * @Entity
 */
class SomeEntity implements JsonSerializable
{
    // ...

    protected $isList;

    public function toList()
    {
        $this->isList = TRUE;

        return $this;
    }

    private function jsonSerializeToList()
    {
        return [ // array representing list... ]
    }

    public function jsonSerialize()
    {
        if( $this->isList ) {
            $normalized = $this->jsonSerializeToList();
        } else {
            $normalized = array(
                'title' => $this->title,
                'text'  => $this->text,
            );
        }

        return $normalized;
    }
}

而这个方法的调用方式为json_encode($someEntityInstance->toList());。不过这种写法有点笨拙,所以我建议采用接口统一的思路。


有没有创建两个组来进行json序列化的选项?例如,我有一个帖子: 一个用于列表的json序列化:id、标题,以及一个用于帖子详细信息的json序列化: id、标题、内容、标签等。 - Random User
嗯,它应该是相当一致的,与Doctrine返回的实体相同,除非您编写并定义自定义查询。但是,有一种方法可以通过它进行黑客攻击。请参见更新。 - Damaged Organic

2
最好的解决方案是在Symfony中启用序列化组件:
#app/config/config.yml
framework:
   serializer:      ~

注意:默认情况下,序列化组件被禁用,您需要取消注释app/config/config.yml文件中的配置行。

这给我一个错误:检测到循环引用(配置限制:1)。 - Random User
也许您遇到了循环引用异常,因为Post实体与另一个实体存在关联,而该实体又引用了Post实体。请参考以下链接: http://symfony.com/doc/current/components/serializer.html#handling-circular-references - frieser
是的,我有关于帖子和分类的关联,但我不知道该怎么做 :/ - Random User
http://symfony.com/blog/new-in-symfony-2-7-serialization-groupshttps://gist.github.com/frieser/ac5e395c271e050d4d6e399b7353d858https://gist.github.com/frieser/75177d1a0c1dd5d0c639612394a5d8b6 - frieser

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接