Исключить некоторые атрибуты из реляционной сущности RestBundle Symfony2

0

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

Например, у меня есть объект Users и Album, и я просто хочу выставить имя пользователя, когда я получу список альбомов.

Является ли это возможным?

Вот мой объект Album:

<?php

namespace Billion\AlbumBundle\Entity;

use Billion\AlbumBundle\Entity\Media;
use Doctrine\ORM\Mapping as ORM;

/**
 * Album
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Album
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    private $id;

    /**
     * @var string
     *
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;

    /**
     * @var string
     *
     * @ORM\Column(name="longitude", type="string", length=255, nullable=true)
     */
    private $longitude;

    /**
     * @var string
     *
     * @ORM\Column(name="latitude", type="string", length=255, nullable=true)
     */
    private $latitude;

    /**
     * @ORM\OneToMany(targetEntity="Billion\AlbumBundle\Entity\Media", mappedBy="album")
     **/
    private $medias;

    /**
     * @ORM\OneToOne(targetEntity="Billion\UserBundle\Entity\Users")
     * @ORM\JoinColumn(name="owner_id", referencedColumnName="id", nullable=false)
     */
    private $owner;

    /**
     * @ORM\OneToOne(targetEntity="Billion\SecurityBundle\Entity\Visibility")
     * @ORM\JoinColumn(name="visibility_id", referencedColumnName="id", nullable=false)
     */
    private $visibility;


    /**
     * Constructor
     */
    public function __construct()
    {
        $this->medias = new \Doctrine\Common\Collections\ArrayCollection();
    }

}

И мое лицо:

namespace Billion\UserBundle\Entity;

use FOS\UserBundle\Model\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;

/**
 * Users
 *
 * @ORM\Table()
 * @ORM\Entity
 */
class Users extends BaseUser
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="AUTO")
     */
    protected $id;

    /**
     * @ORM\OneToMany(targetEntity="Billion\UserBundle\Entity\Friends", mappedBy="myFriends")
     **/
    private $myFriends;


    /**
     * Get id
     *
     * @return integer 
     */
    public function getId()
    {
        return $this->id;
    }
    /**
     * Constructor
     */
    public function __construct()
    {
        $this->myFriends = new \Doctrine\Common\Collections\ArrayCollection();
    }

    /**
     * Add myFriends
     *
     * @param \Billion\UserBundle\Entity\Friends $myFriends
     * @return Users
     */
    public function addMyFriend(\Billion\UserBundle\Entity\Friends $myFriends)
    {
        $this->myFriends[] = $myFriends;

        return $this;
    }

    /**
     * Remove myFriends
     *
     * @param \Billion\UserBundle\Entity\Friends $myFriends
     */
    public function removeMyFriend(\Billion\UserBundle\Entity\Friends $myFriends)
    {
        $this->myFriends->removeElement($myFriends);
    }

    /**
     * Get myFriends
     *
     * @return \Doctrine\Common\Collections\Collection 
     */
    public function getMyFriends()
    {
        return $this->myFriends;
    }
}

И вот моя политика исключения для пользователей:

Billion\AlbumBundle\Entity\Album:
    exclusion_policy: ALL
    properties:
        name:
            expose: true
        longitude:
            expose: true
        latitude:
            expose: true
        visibility:
            expose: true
        medias:
            expose: true
        owner:
            expose: true

Спасибо за любую помощь !

Теги:
rest
fosrestbundle

1 ответ

1
Лучший ответ

Я бы рекомендовал использовать стратегию исключения JMSSerializerBundle для создания разных представлений. Таким образом, вы можете иметь объект, сериализованный по-разному в зависимости от вида. Таким образом, в вашем случае вы можете создать представление для сериализации альбомов, которое будет показывать только имя пользователя, когда дело доходит до объекта пользователя. Тогда у вас может быть другой вид для сериализации вашего полного пользовательского объекта, если вы хотите показать все свойства.

Вот пример, я использую аннотации, но вы также можете использовать свою конфигурацию yaml. Я также не использовал FOSUserBundle, поэтому мой класс немного отличается, но он имеет смысл.

class User implements AdvancedUserInterface
{
/**
 * @Groups({"user"})
 *
 * @ORM\Column(name="user_id", type="integer", nullable=false)
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="SEQUENCE")
 */
private $userId;

/**
 * @Groups({"user", "album"})
 * @ORM\Column(name="username", type="string", nullable=true)
 */
private $username;

/**
 * @Exclude
 * @ORM\Column(name="password", type="string", nullable=true)
 */
private $password;

// .......

}

И в вашем классе альбома что-то вроде:

class Album
{
/**
 * @var integer
 * @Groups({"album"})
 * @ORM\Column(name="id", type="integer")
 * @ORM\Id
 * @ORM\GeneratedValue(strategy="AUTO")
 */
private $id;

/**
 * @var string
 * @Groups({"album"})
 * @ORM\Column(name="name", type="string", length=255)
 */
private $name;

// ......

}

Вот пример того, как использовать его в контроллере (FOSRestBundle)

/**
 * Get currently logged in user
 */
public function getCurrentuserAction(){
    $loggedInUser = $this->get('security.context')->getToken()->getUser();

    $view = $this->view($loggedInUser , 200);

    $view->setSerializationContext(
        SerializationContext::create()->setGroups(array('user'))
    );
    return $this->handleView($view);
}

/**
 * Get album
 */
public function getCurrentuserAction(){
    $album = // get your album object

    $view = $this->view($album , 200);

    // set the group to only include the 'album' properties (including the 'album' marked username in the user object)
    $view->setSerializationContext(
        SerializationContext::create()->setGroups(array('album'))
    );
    return $this->handleView($view);
}

Этот метод довольно гибкий, и вы можете создать столько групп, сколько хотите.

  • 0
    Большое спасибо, это именно то, что я хочу!

Ещё вопросы

Сообщество Overcoder
Наверх
Меню