Php 从关系实体RestBundle Symfony2中排除某些属性
我想在返回具有关系的对象时排除一些属性 例如,我有一个实体用户和相册,我只想在获得相册列表时公开用户名 可能吗 这是我的相册实体:Php 从关系实体RestBundle Symfony2中排除某些属性,php,rest,symfony,fosrestbundle,Php,Rest,Symfony,Fosrestbundle,我想在返回具有关系的对象时排除一些属性 例如,我有一个实体用户和相册,我只想在获得相册列表时公开用户名 可能吗 这是我的相册实体: <?php namespace Billion\AlbumBundle\Entity; use Billion\AlbumBundle\Entity\Media; use Doctrine\ORM\Mapping as ORM; /** * Album * * @ORM\Table() * @ORM\Entity */ class 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();
}
}
以下是我对用户的排除策略:
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)中使用它的示例
这种方法非常灵活,您可以创建任意数量的组。非常感谢,这正是我想要的!
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;
// ......
}
/**
* 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);
}