Symfony 2 JMS Serializer Bundle - Сериализация только идентификаторов для друзей пользователя

У меня есть вопрос о пакете JMS Serializer Bundle в Symfony 2.

Я хочу сериализовать объект пользователя, который имеет отношение «многие ко многим» с самим собой, называемое «друзьями».

Хотя я хочу предоставить кучу свойств от исходного пользователя, мне нужны только идентификаторы из объектов друзей, которые также являются объектами пользователя.

Как я могу решить эту проблему?

Заранее спасибо.


person ZeeCoder    schedule 05.06.2014    source источник


Ответы (2)


Ладно, пока я писал вопрос, я его и решил.

Решение — использовать аннотацию @VirtualProperty.

Пример:

use JMS\Serializer\Annotation\VirtualProperty;
use JMS\Serializer\Annotation\SerializedName;

// ...

/**
 * @VirtualProperty
 * @SerializedName("friends")
 */
public function getFriendIdsOnly()
{
    $friendIds = array();
    foreach ($this->friends as $friendEntity) {
        $friendIds[] = $friendEntity->getId();
    }
    return $friendIds;
}

При этом ключ «друзья» будет содержать массив идентификаторов пользователей.

person ZeeCoder    schedule 05.06.2014

Или, может быть, вы могли бы использовать аннотацию @Groups.

class User
{
    /*
     * @JMS\Groups({"user_id", "friend_id"})
     */
    $id;

    /*
     * @JMS\Groups({"user_friends"})
     */
    $friends;
}

И когда вы хотите сериализовать, вы настраиваете группы ["user_friends", "friend_id"]. Разница с вашим решением заключается в формате возврата (если говорить о json)

// You
{"id":, "friends":["id", "id"]}

// Me
{"id":, "friends":[{"id":}, {"id":}]}

Решение с группами обеспечивает более управляемый возврат. Если однажды вы захотите, например, вернуть имя пользователя, вам просто нужно изменить аннотации групп.

person AlixB    schedule 06.06.2014
comment
Интересное решение, спасибо! Хотя я разместил вопрос со своим ответом - и поэтому мне пришлось принять это - я поддерживаю ваш пост и благодарю вас за ваше понимание. - person ZeeCoder; 07.06.2014
comment
Это было просто, чтобы дать альтернативу :) - person AlixB; 07.06.2014