gpt4 book ai didi

php - Symfony 2 使用自定义反规范化器对嵌套对象进行反规范化

转载 作者:行者123 更新时间:2023-12-03 01:52:38 26 4
gpt4 key购买 nike

Here我正在为 REST API 构建 Symfony SDK。大多数数据是嵌套有其他 JSON 对象的 JSON 对象。就像这里

{
"id": "eng_pl",
"name": "Premier League",
"_links": {
"self": {
"href": "/tournaments/eng_pl"
},
"seasons": {
"href": "/tournaments/eng_pl/seasons/"
}
},
"coverage": {
"id": "eng",
"name": "England",
"_links": {
"self": {
"href": "/territories/eng"
}
}
}
}

反序列化必须生成一个与下面列出的代码生成的对象相同的对象:

$tournament = new Tournament();
$tournament->setId('eng_pl');
$tournament->setName('Premier League');

$coverage = new Territory();
$coverage->setId('eng');
$coverage->setName('England');

$tournament->setCoverage($coverage);

我正在使用自己的自定义反规范化器,位于锦标赛对象的反规范化器代码片段下方:

class TournamentDenormalizer implements DenormalizerInterface
{

/**
* @inheritdoc
*/
public function supportsDenormalization($object, $type, $format = null)
{

if ($type != Tournament::class) {
return false;
}
return true;
}

/**
* @inheritdoc
* @return Tournament
*/
public function denormalize($object, $class, $format = null, array $context = array())
{
$tournament = new Tournament();
$tournament->setId($object->id);
$tournament->setName($object->name);

if (isset($object->coverage)) {
/** @var Territory $coverage */
$coverage = ???; //HOWTO how to implement Territory denormalization here???
$tournament->setCoverage(
$coverage
);
}
return $tournament;
}
}

问题是我应该如何访问 TournamentDenormalizer 中的 TerritoryDe​​normalizer?我看到两个选项:

第一个(我现在正在使用)是将implements DenormalizerAwareInterface添加到denormalizer类的签名中,并依赖于Symfony\Component\Serializer\Serializer类:

$serializer = new Symfony\Component\Serializer\Serializer(
[
new TournamentDenormalizer(),
new TerritoryDenormalizer()
], [
new Symfony\Component\Serializer\Encoder\JsonDecode()
]
);
$serializer->deserialize($json, Tournament::class, 'json');

所以在 TournamentDeserializer 中它会像这样:

if (isset($object->coverage)) {
/** @var Territory $coverage */
$coverage = $this->denormalizer->denormalize(
$object->coverage,
Territory::class,
$format,
$context
);
$tournament->setCoverage(
$coverage
);
}
}

第二种方法是显式注入(inject)必要的反规范化器

$tournamentDenormalizer = new TournamentDenormalizer();
$tournamentDenormalizer->setTerritoryDenormalizer(new TerritoryDenormalizer());

所以在 TournamentDeserializer 中它会像这样:

if (isset($object->coverage)) {
/** @var Territory $coverage */
$coverage = $this->territoryDenormalizer->denormalize(
$object->coverage,
Territory::class,
$format,
$context
);
$tournament->setCoverage(
$coverage
);
}
}

哪种方法最好?有哪些可能的替代方法?

最佳答案

让规范化器实现 NormalizerAwareInterface (并最终使用 NormalizerAwareTrait)是正确的方法,此接口(interface)是针对此特定用例引入的。

关于php - Symfony 2 使用自定义反规范化器对嵌套对象进行反规范化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41180198/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com