2016-12-16 40 views
9

Here我正在構建用於REST API的Symfony SDK。大多數數據是嵌套其他JSON對象的JSON對象。喜歡這裏Symfony 2使用自定義denormalizers對嵌套對象進行反規範化

{ 
    "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); 

我用我自己的自定義Denormalizers,的解歸的代碼錦標賽對象片段下方:

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類解歸簽字,並依靠Symfony\Component\Serializer\Serializer類:所以在TournamentDeserializer

$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 
     ); 
    } 
} 

第二種方法 是注入必要denormalizers明確

$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 
     ); 
    } 
} 

哪種方法是最好的?還有哪些可行的方法?

回答

1

使您的標準化程序執行NormalizerAwareInterface(並最終使用NormalizerAwareTrait)是要走的路,此接口已引入此特定用例。

相關問題