Слушатель сериализации JMS: добавленные объекты пусты

Я создаю проект Symfony3. Я использую JMS для сериализации. У меня есть объект Group с отношением ManyToMany к User. Я пытаюсь добавить дополнительные данные к Group объектам. Я использую прослушиватель сериализации для достижения этой цели. Например, я хочу получить членов группы для этой группы, которые ходили в ту же школу, что и текущий пользователь. Я setData группирую объект следующим образом:

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

person misha    schedule 06.10.2017    source источник


Ответы (1)


Ссылаясь на документ исходного кода здесь вы можете добавить только 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);

Надеюсь, это поможет

person Matteo    schedule 06.10.2017
comment
это объясняет, почему я не мог отобразить объект. Спасибо. Я попытался получить результаты с помощью getArrayResults() в репозитории пользователя. однако мне нужно получить объекты, а не вложенные массивы в списке членов. поэтому я понял, что это не лучшее решение для меня - person misha; 06.10.2017