Symfony2:使用JMS Serializer嵌套对象超时

时间:2013-12-26 20:05:06

标签: json symfony jmsserializerbundle

尝试序列化具有3个嵌套对象属性的对象会导致

  

错误:达到了'250'的最大函数嵌套级别

实体志愿者拥有OneToOne with Person,OnetoMany with Focuses,OneToMany with Skills。如果响应序列化$volunteer->getPerson();,则会发生预期的json响应。但是,$volunteer->getFocuses();也会触发最大嵌套级别错误。

更新

当xdebug max增加时,这在开发环境中仅在30秒内超时。

控制器代码段:

$em = $this->getDoctrine()->getManager();
$serializer = \JMS\Serializer\SerializerBuilder::create()->build();
$volunteer = $em->getRepository('HOTV2Bundle:Volunteer')->find($id);
$response = new JsonResponse($serializer->serialize($volunteer, 'json'));

3 个答案:

答案 0 :(得分:2)

您的最大嵌套级别问题表明您尝试序列化的次数超出了您的需要。

指定要使用JMS实体配置(注释,xml或yml)序列化的字段。我使用注释。我总是首先使用@ ExclusionPolicy(“all”)注释我的实体/文档,然后显式地@ Expose属性和关系。

@ Accessor和@ VirtualProperty方法注释对于自定义输出非常有用。与其将相关的Focuses序列化为对象,您可以使用@VirtualProperty注释getFocusTitles方法,以序列化一个简单的标题数组,如果这就是您所需要的。

当然,您需要按上述方式注释相关实体。

答案 1 :(得分:0)

这是一个xdebug错误消息。这意味着您拥有自称超过250次的递归函数。

你应该增加php.ini中的嵌套级别。

xdebug.max_nesting_level = 1000

否则您可以使用

在脚本中设置嵌套级别
ini_set('xdebug.max_nesting_level', 1000)

答案 2 :(得分:0)

假设有无限递归试图序列化实体我构建了以下可以序列化的数组。该函数以Volunteer对象作为参数。

public function createVolunteerArray($vol) {
    $p = $vol->getPerson();
    $person = array(
        'id' => $p->getId(),
        'firstName' => $p->getFirstName(),
        'lastName' => $p->getLastName(),
        'email' => $p->getEmail(),
        'address' => $p->getAddress(),
        'city' => $p->getCity(),
        'state' => $p->getState(),
        'zip' => $p->getZip(),
    );
    $f = $vol->getFocuses();
    $focusArray = array();
    foreach ($f as $foc) {
        $focus['id'] = $foc->getId();
        $focus['focus'] = $foc->getFocus();
        $focusArray[] = $focus;
    }
    $s = $vol->getSkills();
    $skillArray = array();
    foreach ($s as $sk) {
        $skill['id'] = $sk->getId();
        $skill['skill'] = $sk->getSkill();
        $skillArray[] = $skill;
    }
    $volunteer = array(
        'person' => $person,
        'focuses' => $focusArray,
        'skills' => $skillArray,
    );
    return $volunteer;
}