Symfony - 处理循环引用时的无限循环

时间:2018-03-13 10:29:48

标签: json symfony circular-reference

我目前正在尝试序列化具有循环引用的数组。为了处理循环引用,我从Symfony Docs

中获取了代码
$encoders = array(new XmlEncoder(), new JsonEncoder());
$normalizer = new ObjectNormalizer();
$normalizer->setCircularReferenceLimit(2);
$normalizer->setCircularReferenceHandler(function ($object) {
    return $object->getId();
});
$normalizers = array($normalizer);
$serializer = new Serializer($normalizers, $encoders);
$json = $serializer->serialize($myArray, 'json');

但是,当我尝试运行代码时,页面会无限加载,不会抛出异常,也不会生成日志,唯一的恢复方法是终止服务器并重新运行它。

我不能var_dump变量$myArray因为它是自引用的,因此使指令无限循环。

array:2 [▼
  0 => Commande {#2155 ▼
    #commerce: Commerce {#2623 ▶}
    #stripe_charge: null
    #id: 2
    #user: "admin"
    #commerce_nom: null
    #valide: false
    #cloture: false
    #paye: false
    #livre: false
    #date_livraison: null
    #livraison_remarque: null
    #valide_remarque: null
    #cout: CommandeCout {#2812 ▶}
    #lieu_livraison: null
    #commande_produits: PersistentCollection {#2671 ▶}
    #createdAt: DateTime @1520264795 {#2056 ▶}
    #updatedAt: DateTime @1520264795 {#2055 ▶}
  }
  1 => Commande {#2791 ▼
    #commerce: Commerce {#2788 ▶}
    #stripe_charge: null
    #id: 3
    #user: "admin"
    #commerce_nom: null
    #valide: false
    #cloture: false
    #paye: false
    #livre: false
    #date_livraison: null
    #livraison_remarque: null
    #valide_remarque: null
    #cout: CommandeCout {#2811 ▶}
    #lieu_livraison: null
    #commande_produits: PersistentCollection {#2780 ▶}
    #createdAt: DateTime @1520339269 {#2797 ▶}
    #updatedAt: DateTime @1520339269 {#2796 ▶}
  }
]

字段" commande_produits"包含对象" Commande#2155"的引用。我不明白为什么我使用的循环处理程序无法工作。

1 个答案:

答案 0 :(得分:0)

也许在这种情况下,最好指示Doctrine在您的实体的引用声明中进行额外的延迟加载,如下例所示:

/**
 * @ORM\ManyToMany(targetEntity="Commande", fetch="EXTRA_LAZY")
 */
public $commande_produits;