2016-05-07 19 views
1

Ich verwende JMSSerializerBundle und FOSRestBundle und ich versuche, meinen Körper Anfrage mittels der @ParamConverter Anmerkung deserialisieren:wie mit @ExclusionPolicy eine POST-Körper-Inhalte in einer Entität deserialisieren („alle“) gesetzt

/** 
* @View() 
* 
* @Route("https://stackoverflow.com/users/{username}/globaltoken", defaults={"_format" = "json"}, requirements={"user"="\w+"}) 
* @ParamConverter(
*  "userBody", class="Belka\AuthBundle\Entity\User", 
*  converter="fos_rest.request_body" 
*) 
*/ 
public function postAction($username, User $userBody) 
{ 
... 

Die User Einheit hat @ExclusionPolicy("all") festgelegt und einige Attribute sind @expose d. Das ist perfekt, wenn ich serialisiere; leider, wenn es darum geht, meinen Körper in ein User Objekt zu deserialisieren, werden die unbelichteten Attribute nicht gesetzt. Gibt es einen sauberen Weg, damit umzugehen?

Antwort

0

Ich selbst antworten: @ExclusionPolicy(“all”) ist nicht das, was Sie aus Sicherheitsgründen wollen. Dieses Tag wurde für die Verarbeitung von Daten entwickelt, die nicht serialisiert werden sollten, unabhängig davon, ob sie aus Sicherheitsgründen nicht angezeigt werden oder nicht. Es ist eine statische Sache und es ist in Ordnung so.

Was ich wirklich wollte, ist zu verwalten, was zu zeigen oder nicht (oder für die Deserialisierung berücksichtigen) mit groups. Daraus folgt:

  1. einige Gruppen Deklarieren und weist auf den Attributen
  2. die gewünschten Gruppen in den Controller Verwendung: Deserialisierung und Serialisierung werden prüfen nur die Attribute zu mindestens einer Gruppe gehört, erklärt.

Ein Beispiel:

* Entity *

class User implements EncoderAwareInterface 
{ 
    /** 
    * @ORM\Id 
    * @ORM\Column(type="string") 
    * @Assert\NotBlank(message = "user.username.not_blank") 
    * @ORM\GeneratedValue(strategy="NONE") 
    * @Serializer\Groups({"default"}) 
    */ 
    private $username; 

    /** 
    * @ORM\Column(type="string", nullable=true) 
    * @Serializer\Groups("personal") 
    */ 
    private $password; 

    ... 

* Controller *

/** 
* @ParamConverter(
*  "userBody", 
*  class="Belka\AuthBundle\Entity\User", 
*  converter="fos_rest.request_body", 
*  options={"deserializationContext"={"groups"={"personal"}}} 
*) 
*/ 
public function postAction($username, User $userBody, $_format) 
{ 

auf diese Weise, nur Passwort wird deserialisiert werden.