我需要实体,应用程序和投票。
这个想法是将多对一联系起来。因此,应用程序有很多投票,一个投票用于一个应用程序。
在我的实体课程中,我有这样的设置:
申请实体类:
\/**
\* @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
答案 0 :(得分:1)
实体容易出现递归问题,如果您var_dump
或print_r
有权,则会挂起。
能够将实体转换为层次结构非递归树的最佳序列化工具之一是:https://github.com/schmittjoh/JMSSerializerBundle
它与FOSRestBundle一起使用,作为其透明的可接受响应处理的一部分。
您遇到类似的问题:Avoiding recursion with Doctrine entities and JMSserializer
查看解决方案,并尝试使用JMSSerializer。
编辑:其他可能原因:
当您返回array
时,您将返回该数组中包含的表单。
您的事件侦听器正在尝试将其序列化为json,这既是问题的原因,也是相对无意义的,除非该表单用于提供增强的数据模板。
无论哪种方式,表单都不能如此简单地序列化,你甚至意味着这样做吗?