2017-09-04 17 views
2

Symfonyシリアライザを使用して複数のクラスからデータをシリアライズする際に、複数のノーマライザを使用する方法を教えてもらえますか?Symfonyシリアライザで複数のノーマライザを使用(チェーン?)する方法は?

class User 
{ 
    private $name; 
    private $books; 

    public function __construct() 
    { 
     $this->books = new ArrayCollection(); 
    } 

    // getters and setters 
} 

class Book 
{ 
    private $title; 

    public function getTitle() 
    { 
     return $this->title; 
    }  

    public function setTitle($title) 
    { 
     $this->title = $title; 
    } 
} 

そして、私は、複数の本を持っているユーザーをシリアル化したい:

は、私は次のクラスを持っていると言うことができます。

$first = new Book(); 
$first->setTitle('First book'); 

$second = new Book(); 
$second->setTitle('Second book'); 

$user = new User(); 
$user->setName('Person name'); 
$user->addBook($first); 
$user->addBook($second); 

dump($this->get('serializer')->serialize($user, 'json')); 
die(); 

のは、私も本を直列化ハッシュを含めたいとしましょう、私は、次の正規化があります。

class BookNormalizer implements NormalizerInterface 
{ 
    public function normalize($object, $format = null, array $context = array()) 
    { 
     return [ 
      'title' => $object->getTitle(), 
      'hash' => md5($object->getTitle()) 
     ]; 
    } 

    public function supportsNormalization($data, $format = null) 
    { 
     return $data instanceof Book; 
    } 
} 

そして、私が期待した結果になっています: {"name":"Person name","books":[{"title":"First book","hash":"a9c04245e768bc5bedd57ebd62a6309e"},{"title":"Second book","hash":"c431a001cb16a82a937579a50ea12e51"}]}

を問題は、Userクラスのノーマライザを追加したときに発生します。

class UserNormalizer implements NormalizerInterface 
{ 
    public function normalize($object, $format = null, array $context = array()) 
    { 
     return [ 
      'name' => $object->getName(), 
      'books' => $object->getBooks() 
     ]; 
    } 

    public function supportsNormalization($data, $format = null) 
    { 
     return $data instanceof User; 
    } 
} 

今、書籍が以前に与えられた正規化を用いて正規化されていない、と私は、次を得る: {"name":"Person name","books":[{},{}]}

私は常に一定の種類の正規化を(呼び出す方法(ドキュメントや他の記事を)見つけることを試みました例えば。データがネストされて別のノーマライザで使用されているにもかかわらず、ブックの型がBookの場合は常にBook Normalizerを呼び出します)、成功することはできません。

ノーマライザについて何か誤解していると思いますが、何がわからないのでしょうか。誰かに説明できるのは、私が可能にしたいこととそれをやり遂げる方法です。

答えて

0

あなたはあなたの本

  • のための正規化にアクセスできるようにブック

コード用のインターフェースに追加

  • 使用トレイト
  • コール正規化()メソッドをNormalizerAwareTraitを使用する必要があります。

    class UserNormalizer implements NormalizerInterface, NormalizerAwareInterface 
    { 
        use NormalizerAwareTrait; 
    
        public function normalize($object, $format = null, array $context = array()) 
        { 
         return [ 
          'name' => $object->getName(), 
          'books' => $this->normalizer->normalize($object->getBooks(), $format, $context) 
         ]; 
        } 
    
        public function supportsNormalization($data, $format = null) 
        { 
         return $data instanceof User; 
        } 
    } 
    
  • 関連する問題