【问题标题】:Exclude some attributes from relational entity RestBundle Symfony2从关系实体 RestBundle Symfony2 中排除一些属性
【发布时间】:2014-11-07 10:52:00
【问题描述】:

当我返回一个有关系的对象时,我想排除一些属性。

例如,我有一个实体用户和专辑,我只想在获得专辑列表时公开用户名。

有可能吗?

这是我的相册实体:

<?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

感谢您的帮助!

【问题讨论】:

    标签: php rest symfony fosrestbundle


    【解决方案1】:

    我建议使用 JMSSerializerBundle 的exclusion strategy for creating different views。这样,您可以根据视图对对象进行不同的序列化。因此,在您的情况下,您可以创建一个用于序列化专辑的视图,该视图仅在涉及用户对象时显示用户名。然后,当您想要显示所有属性时,您可以有另一个视图来序列化您的完整用户对象。

    这是一个示例,我使用的是注释,但您也可以使用您的 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);
    }
    

    这种方法非常灵活,您可以根据需要创建任意数量的组。

    【讨论】:

    • 非常感谢,这正是我想要的!
    猜你喜欢
    • 2016-11-16
    • 2023-03-05
    • 1970-01-01
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 2014-03-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多