2016-02-16 80 views
7

我有實體:Symfony2,FOSRestBundle。如何使用JMSSerializerBundle組?

<?php 
namespace AppBundle\Entity; 

use Doctrine\ORM\Mapping as ORM; 
use JMS\Serializer\Annotation\Groups; 
//... 


/** 
    * @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository") 
    **/ 
class User extends BaseUser 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="integer") 
    * @ORM\GeneratedValue(strategy="AUTO") 
    * @Groups({"default"}) 
    */ 
protected $id; 

/** 
* @ORM\ManyToMany(targetEntity="StorageBundle\Entity\File") 
* @ORM\JoinTable(name="users_photos", 
*  joinColumns={@ORM\JoinColumn(name="user_id", referencedColumnName="id")}, 
*  inverseJoinColumns={@ORM\JoinColumn(name="photo_id", referencedColumnName="id", onDelete="CASCADE")} 
*  ) 
* @Groups({"default"}) 
*/ 
protected $photoFiles; 

/** 
* @ORM\Column(type="string", length=255, nullable=true, unique=false) 
* @Groups({"notification"}) 
*/ 
protected $deviceId; 

/** 
* @ORM\Column(type="string", length=255, nullable=true, unique=false) 
    *  @Groups({"default"}) 
*/ 
protected $name; 

/** 
* @ORM\OneToOne(targetEntity="AppBundle\Entity\Car", mappedBy="driver") 
* @Groups({"driver"}) 
*/ 
private $car; 

/** 
* @var \DateTime $created 
* 
* @Gedmo\Timestampable(on="create") 
* @ORM\Column(type="datetime") 
* @Groups({"default"}) 
*/ 
protected $created; 

/** 
* @var \DateTime $updated 
* 
* @Gedmo\Timestampable(on="update") 
* @ORM\Column(type="datetime") 
* @Groups({"default"}) 
*/ 
protected $updated; 


} 

我的控制器:

<?php 
namespace AppBundle\Controller; 

use AppBundle\Entity\User; 
//... 

class UsersController extends AppController{ 

    /** 
    * Get list of Admins 
    * @Annotations\Get("/api/v1/admins", name="list_of_admins") 
    * @return \FOS\RestBundle\View\View 
    */ 
    public function getAdminsAction(){ 

     if(!$this->isGranted('ROLE_ADMIN')){ 
      throw new AccessDeniedException('Only for Admin'); 
     } 

     $admins = $this->getDoctrine()->getRepository('AppBundle:User')->findByRole('ROLE_ADMIN'); 

     return $this->view(['data' => $admins], Codes::HTTP_OK); 

    } 

} 

與角色ROLE_ADMIN的用戶不具有(汽車只有與角色ROLE_DRIVER用戶)。當我嘗試獲取所有管理員時,我得到:

{ 
    "id": 4, 
    "username": "[email protected]", 
    "email": "[email protected]", 
    "roles": [ 
    "ROLE_ADMIN" 
    ], 
    "photoFiles": [], 
    "name": "Andrii", 
    "car": null 
} 

我試過添加組。 我需要補充我的控制器只從組默認通知

回答

9

作爲提醒,Groups接收JMSSerializer的數據,作爲排除的策略。

排除策略包含根據條件/上下文用於公開/排除屬性的特定方法。

爲了正確地使用它們,你必須做的第一件事就是排除你的實體的所有屬性:

// ... 
use JMS\Serializer\Annotation as JMS; 

/** 
* @ORM\Entity(repositoryClass="AppBundle\Repository\UserRepository") 
* @JMS\ExclusionPolicy("all") 
*/ 
class User extends BaseUser 

現在,你已經明確暴露取決於Groups屬性:

/** 
* @ORM\Column(type="string", length=255, nullable=true, unique=false) 
* @JMS\Groups({"default"}) // Idem for all properties you want render in group "default" 
*/ 
protected $name; 

/** 
* @ORM\Column(type="string", length=255, nullable=true, unique=false) 
* @JMS\Groups({"notification"}) 
*/ 
protected $deviceId; 

然後,您必須在控制器操作中定義使用的Group

/** 
* Get list of Admins 
* @Annotations\Get("/api/v1/admins", name="list_of_admins") 
* @Annotations\View(serializerGroups={"default", "notification"}) // Here set the Group used 
* @return \FOS\RestBundle\View\View 
*/ 
public function getAdminsAction() 
{ 
    if(!$this->isGranted('ROLE_ADMIN')){ 
     throw new AccessDeniedException('Only for Admin'); 
    } 

    $admins = $this->getDoctrine()->getRepository('AppBundle:User')->findByRole('ROLE_ADMIN'); 

    return $this->view(['data' => $admins], Codes::HTTP_OK); 
} 

現在,$admins僅包含暴露給組defaultnotification的屬性。

你也可以做到這一點,而不是手動使用的註釋:

$view = $this->view($admins, 200); 
$view->setSerializerGroups(array('default', 'notification')); 

return $this->handleView($view); 

有關詳細信息,請參閱Exclusion strategies

我希望你很清楚。

+0

嗨,我們需要在控制器中使用註釋'* @Annotations \ View(serializerGroups = {「default」,「notification」})來使用什麼導入(使用)?謝謝! –

+2

自我回應:使用FOS \ RestBundle \ Controller \ Annotations –

+0

'setSerializerGroups'功能已被刪除。你需要直接使用[序列化上下文](https://github.com/FriendsOfSymfony/FOSRestBundle/issues/521#issuecomment-207071563)。 – fracz

相關問題