簡體   English   中英

Symfony2:與JMS序列化器嵌套對象一起超時

[英]Symfony2: Times out w/ JMS Serializer nested object

嘗試序列化具有3個嵌套對象屬性的對象會導致

錯誤:最大功能嵌套級別達到“ 250”

實體志願者具有與人的一對一,具有焦點的一對多和具有技能的一對多。 如果響應已序列化$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'));

最大嵌套級別問題表明您正在嘗試序列化的序列超出了您的需要。

指定要使用JMS實體配置(注釋,xml或yml)序列化的字段。 我使用注釋。 我總是先用@ ExclusionPolicy (“全部”)注釋我的實體/文檔,然后顯式@ 公開屬性和關系。

@ Accessor和@ VirtualProperty方法注釋對於自定義輸出非常有用。 與其將相關的Focus序列化為對象,還可以使用@VirtualProperty注釋getFocusTitles方法,以序列化一個簡單的標題數組(如果需要的話)。

當然,您將需要如上所述注釋相關實體。

這是一個xdebug錯誤消息。 這意味着您具有遞歸函數,它們自己調用了250次以上。

您應該在php.ini中增加嵌套級別。

xdebug.max_nesting_level = 1000

否則,您可以使用以下命令在腳本中設置嵌套級別

ini_set('xdebug.max_nesting_level', 1000)

假設有無限遞歸嘗試對實體進行序列化,我構建了以下可以序列化的數組。 該函數將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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM