2017-09-04 74 views
2

可有人试图解释我如何与Symfony的串行序列化将多个类的数据时,使用多个正规化?如何在Symfony串行器中使用(chain?)多个规范器?

比方说,我有以下类:

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"}]}

问题是当我还添加了一个正规化的用户等级:

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时,即使数据嵌套并在另一个规范化器中使用,也始终调用规范器)但无法成功。

我想我误解了一些关于正规化,但不知道是什么。有人可以解释是我想要什么和如何做到这一点?

回答

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; 
    } 
} 
相关问题