Я хочу исключить некоторые атрибуты, когда возвращаю объект с отношениями.
Например, у меня есть объект 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
Спасибо за любую помощь !
Я бы рекомендовал использовать стратегию исключения 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); }
Этот метод довольно гибкий, и вы можете создать столько групп, сколько хотите.