首页 文章

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

提问于
浏览
1

我目前正在尝试序列化具有循环引用的数组 . 为了处理循环引用,我从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

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

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

相关问题