2016-02-16 8 views
7

Ich habe Unternehmen:Symfony2, FOSRestBundle. Wie verwende ich eine Gruppe mit 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; 


} 

Mein Controller:

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

    } 

} 

Ein Benutzer mit Rolle ROLE_ADMIN nicht über das Auto (Auto haben nur Benutzer mit Rolle ROLE_DRIVER). Wenn ich versuche, alle Admins zu bekommen, bekomme ich Folgendes:

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

Ich habe versucht, Gruppen hinzuzufügen. Was ich brauche meinen Controller hinzufügen Daten aus Gruppe nur erhalten Standard und Benachrichtigung

Antwort

9

Als Erinnerung, Groups in JMSSerializer als Ausschlussstrategie.

Eine Ausschlussstrategie besteht aus einem spezifischen Ansatz, der zum Freilegen/Ausschließen von Eigenschaften in Abhängigkeit von Bedingung/Kontext verwendet wird.

Um sie richtig zu verwenden, das erste, was Sie tun müssen, ist es, alle Eigenschaften Ihres Unternehmens auszuschließen:

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

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

Nun haben Sie explizit Eigenschaften auf Groups je aussetzen:

/** 
* @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; 

Dann müssen Sie die verwendete Group in Ihrer Controller-Aktion definieren:

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

Jetzt enthält $admins nur die Eigenschaften, die der Gruppe default und notification ausgesetzt sind.

Sie können es auch tun manuell statt Verwendung einer Anmerkung:

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

return $this->handleView($view); 

Weitere Informationen finden Sie Exclusion strategies.

Ich hoffe, es ist klar für Sie.

+0

Hallo, Was importieren (verwenden) müssen wir die Annotation '* @Annotations \ View (serializerGroups = {" Standard "," Benachrichtigung "})' in der Controller? Vielen Dank! –

+2

Selbstantwort: verwenden Sie FOS \ RestBundle \ Controller \ Anmerkungen –

+0

Die Funktion 'setSerializerGroups' wurde entfernt. Sie müssen [Serialisierungskontext direkt] verwenden (https://github.com/FriendsOfSymfony/FOSRestBundle/issues/521#issuecomment-207071563). – fracz

Verwandte Themen