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

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

Например, у меня есть сущность 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();
}

}

И моя сущность Users:

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

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

0

Решение

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

Вот пример, я использую аннотации, но вы также можете использовать свою конфигурацию 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);
}

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

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]