假设我有来自 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
数组中并不能使其工作。结果与上述相同的含义相同的错误。
另外我需要一个回调来规范化属性AgreementTypeId
,agreementType
因为我很确定它也会失败。(事实上目前没有被映射,我认为问题是因为名称不匹配)
任何人都可以帮我解决这个问题吗?