Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/252.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Symfony 2使用自定义反规范化器对嵌套对象进行反规范化_Php_Json_Symfony_Serialization - Fatal编程技术网

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

Php Symfony 2使用自定义反规范化器对嵌套对象进行反规范化,php,json,symfony,serialization,Php,Json,Symfony,Serialization,我正在为RESTAPI构建Symfony SDK。大多数数据都是JSON对象和嵌套的其他JSON对象。像这里 { "id": "eng_pl", "name": "Premier League", "_links": { "self": { "href": "/tournaments/eng_pl" }, "seasons": { "href": "/tournaments/e

我正在为RESTAPI构建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中访问TerritoryDenormalizer?我看到两种选择:

第一个(我现在使用)是将
实现反规范化rawareinterface
添加到反规范化程序类的签名中,并依赖于
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');
因此,在
锦标赛反序列化程序中,如下所示:

if (isset($object->coverage)) {
        /** @var Territory $coverage */
        $coverage = $this->denormalizer->denormalize(
            $object->coverage,
            Territory::class,
            $format,
            $context
        );
        $tournament->setCoverage(
            $coverage
        );
    }
}
if (isset($object->coverage)) {
        /** @var Territory $coverage */
        $coverage = $this->territoryDenormalizer->denormalize(
            $object->coverage,
            Territory::class,
            $format,
            $context
        );
        $tournament->setCoverage(
            $coverage
        );
    }
}
第二种方法 就是显式地注入必要的反规范化器

$tournamentDenormalizer = new TournamentDenormalizer();
$tournamentDenormalizer->setTerritoryDenormalizer(new TerritoryDenormalizer());
因此,在
锦标赛反序列化程序中,如下所示:

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

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

让您的规范化程序实现
NormalizerAwareInterface
(并最终使用
NormalizerAwareTrait
)是可行的方法,此接口已针对此特定用例引入