0

假设我有来自 API 调用的以下响应:

[
  {
    "AgreementNumber": 20266,
    "StartDate": "2005-07-01T00:00:00",
    "EndDate": "2006-06-30T00:00:00",
    "AgreementTypeId": 1,
    "CfProgramLevelId": 2,
    "TamFlag": 0,
    "ParentAgreementNumber": null,
    "DistributorId": 16,
    "CustomerSiteId": 232,
    "RowId": 100,
    "Source": "Wonderware",
    "ActiveFlg": 1
  },
  ...
]

我将该结果映射到一个Agreement实体,如下所示:

$propertyNameConverter = new PropertyNameConverter();
$encoders              = [new XmlEncoder(), new JsonEncoder()];
$normalizers           = [new ObjectNormalizer(null, $propertyNameConverter), new ArrayDenormalizer(),];
$serializer            = new Serializer($normalizers, $encoders);

$entities = $serializer->deserialize($data, "QuoteBundle\\Entity\\Agreement[]", 'json');

这是实体的样子:

class Agreement
{
    /**
     * @var \DateTime
     * @ORM\Column(name="StartDate", type="string", nullable=false)
     */
    private $startDate;

    /**
     * @ORM\OneToOne(targetEntity="QuoteBundle\Entity\AgreementType")
     * @ORM\JoinColumn(name="AgreementTypeID", referencedColumnName="AgreementTypeID")
     */
    private $agreementType;

    /**
     * @param \DateTime $startDate
     */
    public function setStartDate(\DateTime $startDate)
    {
        $this->startDate = $startDate;
    }

    /**
     * @param AgreementType $agreementType
     */
    public function setAgreementType(AgreementType $agreementType)
    {
        $this->agreementType = $agreementType;
    }
}

每次我尝试映射数据时,都会出现以下错误:

给定“日期时间”、“字符串”类型的预期参数

这很好,因为我期待 aDateTime作为startDate. 这里的解决方案是在将数据映射到实体之前对其进行转换|规范化。

我在这里读过,但我找不到如何将此“回调”应用于给定属性,因为该示例是一个简单的用例,而不是一个复杂的用例。

我尝试了以下代码:

$dateTimeNormalizer = new GetSetMethodNormalizer();
$dateTimeCallback   = function ($dateTime) {
    return $dateTime instanceof \DateTime ? $dateTime->format(\DateTime::ATOM) : '';
};

$dateTimeNormalizer->setCallbacks(['startDate' => $dateTimeCallback, 'endDate' => $dateTimeCallback]);

$normalizers = [
    new ObjectNormalizer(null, $propertyNameConverter),
    new ArrayDenormalizer(),
    $dateTimeNormalizer,
];

$serializer = new Serializer($normalizers, $encoders);

但是不起作用,因为我仍然遇到与上述相同的错误。我知道有一个DateTimeNormalizer但将其作为新条目添加到$normalizers数组中并不能使其工作。结果与上述相同的含义相同的错误。

另外我需要一个回调来规范化属性AgreementTypeIdagreementType因为我很确定它也会失败。(事实上​​目前没有被映射,我认为问题是因为名称不匹配)

任何人都可以帮我解决这个问题吗?

4

1 回答 1

1

答案是下面几行 -递归非规范化和类型安全

    $encoder = new JsonEncoder();

    $normalizer = new ObjectNormalizer(null, null, null, new ReflectionExtractor());
    $serializer = new Serializer(array(new DateTimeNormalizer(), $normalizer, new ArrayDenormalizer()), [$encoder]);

    $entities = $serializer->deserialize($data, "QuoteBundle\\Entity\\Agreement[]", 'json');
于 2017-04-13T23:06:45.767 回答