Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/292.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从关系实体RestBundle Symfony2中排除某些属性_Php_Rest_Symfony_Fosrestbundle - Fatal编程技术网

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);
}