Symfony 3串行器问题

Symfony 3 serializer problems

本文关键字:问题 3串 Symfony      更新时间:2023-09-26

您好,我正在Symfony 3.1上创建一个API REST。

我在序列化和对象时遇到问题。

这是它返回给我的错误。

A circular reference has been detected (configured limit: 1).

我读取的堆栈溢出链接没有任何结果。

  • 转换Symfony2 PHP实体对象以在Javascript中使用
  • 检测到循环引用(配置的限制:1(序列化程序

这是我准备的文件,我试着抓住我的目标。

  • Symfony如何使用序列化程序
  • Symfony Serializer组件

这是fill$employees的代码:

$em = $this->getDoctrine()->getManager();
$dql = " SELECT e FROM BackendBundle:Employees e 
         INNER JOIN BackendBundle:Companies c 
         WITH e.idCompany = c.idCompany 
         WHERE c.idUser = ?1";                
$query = $em->createQuery($dql);
$query->setParameter(1,$user);
$employees = $query->getResult();

我试过这些东西:

  1. 首次验证

     use Symfony'Component'Serializer'Serializer;
     use Symfony'Component'Serializer'Encoder'XmlEncoder;
     use Symfony'Component'Serializer'Encoder'JsonEncoder;
     use Symfony'Component'Serializer'Normalizer'ObjectNormalizer;
     $encoders = array(new XmlEncoder(), new JsonEncoder());
     $normalizers = array(new ObjectNormalizer());
     $serializer = new Serializer($normalizers,$encoders);                
     $data = $serializer->serialize($employees, 'json');
    

  2. 防秒

在这些证据中,我在Symfony 3序列号上默认读取的是desabe。为此,我修改了这些文件:

app/config/config.yml

framework:
#esi:             ~
#translator:      { fallbacks: ["%locale%"] }
secret:          "%secret%"
router:
    resource: "%kernel.root_dir%/config/routing.yml"
    strict_requirements: ~
form:            ~
csrf_protection: ~
validation:      { enable_annotations: true }
#serializer:      { enable_annotations: true }
templating:
    engines: ['twig']
default_locale:  "%locale%"
trusted_hosts:   ~
trusted_proxies: ~
session:
    # http://symfony.com/doc/current/reference/configuration/framework.html#handler-id
    handler_id:  session.handler.native_file
    save_path:   "%kernel.root_dir%/../var/sessions/%kernel.environment%"
fragments:       ~
http_method_override: true
assets: ~
serializer:
    enabled: true
    enable_annotations: true

这里unic最重要的是我激活序列化程序的最后几行。

app/config/services.yml

services:    
get_set_method_normalizer:
    class: Symfony'Component'Serializer'Normalizer'GetSetMethodNormalizer
    public: false
    tags:
        - { name: serializer.normalizer }

src/AppBundle/Controller/DefaultController.php

<?php
$serializer = $this->get('serializer');
$json = $serializer->serialize($employees,'json');

在你正在阅读和它之间没有太大区别的地方,再多一点证据。

如果有人知道如何在Symfony 3上序列化对象,请告诉我。我整个上午都在尝试同样的错误。

A circular reference has been detected (configured limit: 1).

您的问题是,序列化Employees就是序列化他们的公司,该公司再次引用了Employee,这是一个完美的循环引用。

您可以在Symfony的Serializer中处理这些循环引用,例如,通过捕获CircularReferenceException或通过在setCircularReferencesHandler中使用自定义可调用,并仅序列化未引用回原始实体的属性。

有关详细说明,请参阅Symfony的文档。

$normalizers->setCircularReferenceHandler(function ($object) {
        return $object->getId();
    });

在创建ObjectNormalizer((的实例后添加此bro。它非常适合我!