1

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

错误:达到“250”的最大函数嵌套级别

Entity Volunteer 有 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'));
4

3 回答 3

2

您的最大嵌套级别问题表明您正在尝试序列化比您需要的更多。

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

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

当然,您需要如上所述注释相关实体。

于 2014-07-29T22:25:33.197 回答
0

假设存在无限递归试图序列化实体,我构建了以下可以序列化的数组。该函数将一个志愿者对象作为其参数。

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;
}
于 2013-12-31T19:59:28.687 回答
0

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

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

xdebug.max_nesting_level = 1000

否则你可以在你的脚本中设置嵌套级别

ini_set('xdebug.max_nesting_level', 1000)
于 2013-12-26T23:01:20.367 回答