FOSRestBundle的序列化程序使用继承的实体引发递归错误

时间:2013-07-17 17:47:43

标签: symfony fosrestbundle jmsserializerbundle

我正在开发一个继承抽象类的应用程序。这些抽象类具有自己的序列化映射,如示例下面的

所示
Hezten\CoreBundle\Model\Enroled:
    exclusion_policy: ALL

抽象类:

<?php

namespace Hezten\CoreBundle\Model;

abstract class Enroled implements EnroledInterface
{
    protected $student;

    protected $subject;

    //Some functions...

}

继承上一个类的类如下所示

<?php

namespace XXX\XXXBundle\Entity;

use JMS\Serializer\Annotation\SerializedName;
use JMS\Serializer\Annotation\ExclusionPolicy;
use JMS\Serializer\Annotation\Exclude;

use Doctrine\ORM\Mapping as ORM;

use Hezten\CoreBundle\Model\Enroled as BaseEnroled;

/** 
 * @ORM\Entity 
 * @ExclusionPolicy("NONE")
 */
class Enroled extends BaseEnroled
{
    /** @ORM\Id  
     *  @ORM\ManyToOne(targetEntity="XXX\XXXBundle\Entity\Student", inversedBy="enroled")
     * @Exclude
     */
    protected $student;

    /** @ORM\Id  
     *  @ORM\ManyToOne(targetEntity="XXX\XXXBundle\Entity\Subject", inversedBy="enroled")
     *  @Exclude
     */
    protected $subject;

    /** @ORM\Column(type="boolean") */
    private $field0;

    /** @ORM\Column(type="boolean") 
     */
    private $field1;

    /** @ORM\Column(type="boolean") */
    private $field2;
 }

抛出的错误说明了:

Warning: json_encode() [<a href='function.json-encode'>function.json-encode</a>]: recursion detected in C:\xampp\htdocs\Project\vendor\jms\serializer\src\JMS\Serializer\JsonSerializationVisitor.php line 29

当然,我做错了,因为没有实体暴露,根据映射只有三个“Enroled”实体字段,但我不知道。我花了几天的时间试图弄清楚错误是什么而没有成功。

对映射属性进行映射的正确方法是什么?

更新

用于使用FOSRestBundle序列化JSON的代码:

    $students = $this->get('hezten_core.manager.enroled')->findEnroledBySubject($subject);

    $view = View::create()
    ->setStatusCode(200)
    ->setFormat('json')
    ->setData($students);

    return $this->get('fos_rest.view_handler')->handle($view);

1 个答案:

答案 0 :(得分:0)

最后API正在运行......我必须覆盖我继承的类的元数据,将以下行添加到config.yml

jms_serializer:
    metadata:
        directories:
            HeztenCoreBundle:
                namespace_prefix: "Hezten\\CoreBundle"
                path: "%kernel.root_dir%/serializer/HeztenCoreBundle"

在上面选择的路径中,我为每个模型设置排除策略添加了一个yml文件到ALL:

Hezten\CoreBundle\Model\Enroled:
    exclusion_policy: ALL

我在继承这些模型的实体上使用注释来公开所需的信息。

我不知道这是否是最好的方法,但对我来说效果很好