【问题标题】:Symfony 3 serializer problemsSymfony 3 序列化程序问题
【发布时间】:2016-11-08 10:38:02
【问题描述】:

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

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

这是它返回给我的错误。

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

堆栈溢出链接我已阅读但没有任何结果。

这些是我阅读的用于尝试 seialize 我的对象的文档。

这里是填写 $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 Serialzer 上默认阅读的是 deseabe。为此我修改了这些文件:

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

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

app/config/servces.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).

【问题讨论】:

  • 此链接准确描述了您的问题以及解决方法:symfony.com/doc/current/components/…
  • 感谢 setCircularReferenceHandler 解决了我所有的问题。你知道我怎样才能关闭这些帖子吗?
  • 我将提供链接作为解决方案,您可以接受我的回答。
  • 我不知道该怎么做。我只知道帖子xD
  • 很高兴您找到了它,如果您也想为我的答案投票,也可以点击“向上箭头”按钮。

标签: javascript php serialization doctrine-orm symfony


【解决方案1】:

您的问题是,序列化员工正在序列化他们的公司,这再次引用了员工,这是一个完美的循环引用。

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

详细说明请参见Symfony's documentation

【讨论】:

    【解决方案2】:
    $normalizers->setCircularReferenceHandler(function ($object) {
            return $object->getId();
        });
    

    在创建 ObjectNormalizer() 的实例后添加这个兄弟。 它非常适合我!

    【讨论】:

      猜你喜欢
      • 2019-03-22
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 1970-01-01
      • 2020-05-25
      • 2019-09-07
      • 1970-01-01
      相关资源
      最近更新 更多