【问题标题】:Incorrect serialization with symfony serializer使用 symfony 序列化程序进行不正确的序列化
【发布时间】:2017-06-05 12:15:16
【问题描述】:

我正在尝试使用 symfony/serializer 将我的实体序列化为 json。 我想得到类似的东西

  {
    "id" : "string",
    "name" : "name here",
    "admin": "admin_id"
  }

但我总是以完整的树结束 - 生成的 json 包含所有相关实体及其关系。我相信使用 symfony/serializer 一定是微不足道的任务,并且显然做错了什么,但是什么?

CarbonNormalizer 只返回 nesbot/carbon 对象的字符串表示形式。

这是我的控制器:

    $data=$this->em->getRepository('Cpa:Cpa')->findAll();
    $encoder = new JsonEncoder();
    $normalizer = new GetSetMethodNormalizer();//object -same
    $dateTimeNormalizer = new CarbonNormalizer();
    $normalizer->setCircularReferenceHandler(function ($object) {
        return $object->getId();
    });
    $this->serializer = new Serializer([$dateTimeNormalizer, $normalizer], [$encoder]);

    $data = $this->serializer->serialize($data, 'json', ['groups' => ['show'], 'enable_max_depth' => true]);
    return new JsonResponse($data, $code, [], true);

还有我的实体:

<?php

namespace Domain\Cpa\Models;


use Domain\Offer\Models\CpaOffer;
use Domain\User\Models\User;
use Ramsey\Uuid\Uuid;

class Cpa
{
/** @var  string */
private $id;

/** @var  string */
private $name;

/** @var  User */
private $admin;

/** @var  CpaOffer[] */
private $offers;

/**
 * Cpa constructor.
 * @param string $name
 * @param User $admin
 */
public function __construct($name, User $admin)
{
    $this->id = Uuid::uuid4()->toString();
    $this->name = $name;
    $this->admin = $admin;
    $this->offers = [];
}

/**
 * @return string
 */
public function getId(): string
{
    return $this->id;
}

/**
 * @return string
 */
public function getName(): string
{
    return $this->name;
}

/**
 * @return User
 */
public function getAdmin(): User
{
    return $this->admin;
}

/**
 * @return CpaOffer[]
 */
public function getOffers()//: array
{
    return $this->offers;
}

}

序列化.yml

Domain\Cpa\Models\Cpa:
 attributes:
   id:
    groups: ['show']
   name:
    groups: ['show']
   admin:
    groups: ['show']

【问题讨论】:

    标签: symfony serialization


    【解决方案1】:

    要使用组,您还需要初始化ClassMetadataFactory

    // Don't forget to add the new use statements
    // ...
    $normalizer = new GetSetMethodNormalizer(
      new ClassMetadataFactory(
        new YamlFileLoader('/the/path/to/yourfile.yaml')
      )
    );
    // ...
    

    您还必须修复 YAML 文件的缩进:

    'Domain\Cpa\Models\Cpa':
      attributes:
        id:
          groups: ['show']
        name:
          groups: ['show']
        admin:
          groups: ['show']
    

    【讨论】:

    • 谢谢,凯文。有没有办法将配置的序列化程序注入我的服务/控制器? '/the/path/to/yourfile.yaml' - 它是 serialization.yml 的路径吗?
    猜你喜欢
    • 1970-01-01
    • 2015-07-29
    • 1970-01-01
    • 2021-12-13
    • 2021-05-08
    • 2020-05-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多