Symfony2表单为什么我的表单返回警告:json_encode():检测到递归?

时间:2014-01-03 10:24:03

标签: php forms entity-framework symfony doctrine-orm

我需要实体,应用程序和投票。

这个想法是将多对一联系起来。因此,应用程序有很多投票,一个投票用于一个应用程序。

在我的实体课程中,我有这样的设置:

申请实体类:

\/**
\* @ORM\OneToMany(targetEntity="Vote", mappedBy="application")
\*/
\private $votes;

投票实体类:

\/**
\* @ORM\ManyToOne(targetEntity="Application", inversedBy="votes")
\* @ORM\JoinColumn(referencedColumnName="id")
\*/
\private $application;

我认为这种关系很好或者我错了?

接下来就是我只有一个字段的表单构建器类:

$builder->add('rate')
    ->add('save', 'submit');

投票实体包含字段:(id, username, rate, createdAt, updatedAt, application)

在我的控制器中我正在做这样的事情:

    $vote = new Vote();
    $form = $this->createForm(new VoteType(), $vote);

    $form->handleRequest($this->getRequest());

    if ($form->isValid()) {
        $vote->setUserName($tenant->getUsername());
        $vote->setApplication($app);
        $em->persist($vote);
        $em->flush();

        $this->get('session')->getFlashBag()->add('success', 'Oceniono aplikację.');

        return $this->redirect($this->generateUrl('applications_main'));
    }

    return array( 'form' => $form->createView(), );

它无效,它返回错误:

ContextErrorException: Warning: json_encode(): recursion detected in E:\wamp\www\project\vendor\symfony\symfony\src\Symfony\Component\HttpFoundation\JsonResponse.php line 92

堆栈跟踪(纯文本):http://pastebin.com/bSQTDJQY

1 个答案:

答案 0 :(得分:1)

实体容易出现递归问题,如果您var_dumpprint_r有权,则会挂起。

能够将实体转换为层次结构非递归树的最佳序列化工具之一是:https://github.com/schmittjoh/JMSSerializerBundle

它与FOSRestBundle一起使用,作为其透明的可接受响应处理的一部分。

您遇到类似的问题:Avoiding recursion with Doctrine entities and JMSserializer

查看解决方案,并尝试使用JMSSerializer。

编辑:其他可能原因:

当您返回array时,您将返回该数组中包含的表单。 您的事件侦听器正在尝试将其序列化为json,这既是问题的原因,也是相对无意义的,除非该表单用于提供增强的数据模板。

无论哪种方式,表单都不能如此简单地序列化,你甚至意味着这样做吗?