2017-10-06 44 views
1

我正在构建Symfony3项目。我正在使用JMS进行序列化。我有Group与ManyToMany关系的实体到User。我正在尝试向Group对象添加更多数据。我正在使用序列化侦听器来实现这一点。例如,我想获得与当前用户同一学校的小组成员。我setData到组对象是这样的:JMS序列化侦听器:添加的对象为空

class SerializationListener{ 

    //Constructor 
    /** 
    * @param ObjectEvent $event 
    */ 
    public function onGroupEntitySerialize(ObjectEvent $event) 
    { 
     if (!$this->currentUser) { 
      return; 
     } 

     /** @var GenericSerializationVisitor $visitor */ 
     $visitor = $event->getVisitor(); 

     $group = $event->getObject(); 

     $groupMembersFromUserSchool = $this->em->getRepository('AppBundle:User') 
     ->groupMembersFromUserSchool($group, $this->currentUser); 

     $visitor->setData('members', $groupMembersFromUserSchool); 

     $groupMembersCountFromUserSchool = count($groupMembersFromUserSchool); 

     $visitor->setData('memberCount', $groupMembersCountFromUserSchool); 
    } 
} 

不过,我得到这个作为结果:

{ 
"items": [ 
    { 
     "memberCount": 17, 
     "id": 1, 
     "name": "TestGroup1", 
     "members": [ 
      {}, 
      {}, 
      {}, 
      {}, 
      {}, 
      {}, 
      {}, 
      {}, 
      {}, 
      {}, 
      {}, 
      {}, 
      {}, 
      {}, 
      {}, 
      {}, 
      {} 
     ] 
    } 
    ] 
    } 

所以在members财产用户的详细信息被隐藏。我如何显示它们?

class Group{ 

     /** 
     * @Expose() 
     * @Groups({"group-details", "group-list"}) 
     */ 
     protected $members; 
    } 

    class User{ 
     /** 
     * @Expose() 
     * @Groups({"group-details", "group-list"}) 
     */ 
     private $id; 

     /** 
     * @Expose() 
     * @Groups({"group-details", "group-list"}) 
     */ 
     protected $name; 
    } 

回答

0

谈到source code here的文档,你可以只添加integer|float|boolean|string|array值:

/** 
* Allows you to add additional data to the current object/root element. 
* @deprecated use setData instead 
* @param string $key 
* @param integer|float|boolean|string|array|null $value This value must either be a regular scalar, or an array. 
*              It must not contain any objects anymore. 
*/ 
public function addData($key, $value) 
{ 
    if (isset($this->data[$key])) { 
     throw new InvalidArgumentException(sprintf('There is already data for "%s".', $key)); 
    } 

所以你可以试试:

$arrayValuesOfMembers = // some data as array probably extracted by the repo methods 
    $visitor->setData('members', $arrayValuesOfMembers); 

希望这有助于

+1

这就解释了为什么我无法显示对象。谢谢。我试图通过用户回购中的getArrayResults()获得结果。但是,我需要获取对象,而不是在成员列表中嵌套数组。因此我意识到这对我来说不是最好的解决方案 – misha

相关问题