[英]Symfony2 / JMS Serializer - How to manage differents object structure?
[英]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.