2017-07-20 2 views
0

Ich versuche gerade, ein ziemlich komplexes Objekt zu serialisieren, um es als Antwort in JSON mit dem Symfony Serializer zurückzugeben. Ich habe folgendes Objekt:Symfony ObjectNormalizer leere Eigenschaft Pfad

/** 
* @Doctrine\Entity 
* @Doctrine\Table(name="Fichiers") 
*/ 
class Fichier{ 

/** 
* @Doctrine\Column(name="id", type="integer") 
* @Doctrine\Id 
* @Doctrine\GeneratedValue(strategy="AUTO") 
*/ 
protected $id; 

/** 
* @Doctrine\OneToOne(targetEntity="Utilisateur") 
* @Doctrine\JoinColumn(name="idProprietaire", referencedColumnName="id", nullable=true) 
*/ 
protected $proprietaire; 

/** 
* @Doctrine\OneToOne(targetEntity="Fichier") 
* @Doctrine\JoinColumn(name="idParent", referencedColumnName="id") 
*/ 
protected $parent; 

/** 
* @Doctrine\Column(name="estDossier", type="boolean") 
* @Assert\NotBlank() 
*/ 
protected $estDossier; 

/** 
* @Doctrine\Column(name="nom", type="string", length=250) 
* @Assert\NotBlank() 
*/ 
protected $nom; 

/** 
* @Doctrine\ManyToMany(targetEntity="Groupe") 
* @Doctrine\JoinTable(name="Fichiers_Groupes", 
*  joinColumns={@Doctrine\JoinColumn(name="idFichier", referencedColumnName="id")}, 
*  inverseJoinColumns={@Doctrine\JoinColumn(name="idGroupe", referencedColumnName="id")} 
*) 
*/ 
protected $groupes; 

/** 
* @Doctrine\Column(name="extension", type="string", length=10) 
*/ 
protected $extension; 

/** 
* @Doctrine\Column(name="dateCreation", type="datetime") 
*/ 
protected $dateCreation; 

/** 
* @Doctrine\Column(name="dateModification", type="datetime") 
*/ 
protected $dateModification; 

/** 
* @Doctrine\Column(name="taille", type="integer") 
*/ 
protected $taille; 

Und hier ist mein Controller-Code:

$fichier = $this->getDoctrine()->getRepository(Fichier::class)->find($idFichier); 
$encoder = new JsonEncoder(); 
$normalizer = new ObjectNormalizer(); 
$normalizer->setCircularReferenceHandler(function ($object) { 
    return $object->getId(); 
}); 
$serializer = new Serializer(array($normalizer), array($encoder)); 
$jsonContent = $serializer->serialize($fichier, 'json'); 

ich die folgende Fehlermeldung erhalten:

The property path should not be empty.

Nach einigen Tests habe ich herausgefunden, dass, wenn ich manuell Setzen Sie die Null-Eigenschaften meines Objekts, ich würde diesen Fehler nicht bekommen, aber einen anderen, wo es bei der Konvertierung in String nicht gelingt. Nachdem Sie diese Funktion:

public function __toString() 
{ 
    return strval($this->getId()); 
} 

ich diesen Fehler, wenn man bedenkt id = 4:

Notice: Undefined variable: 4

Gibt es eine Möglichkeit, so dass die Normalisierungseinrichtung die Null Eigenschaften behandelt und/oder um diesen Fehler zu beheben?

Antwort

0

Es ist nicht einfach zu helfen, weil ich nicht die Zuordnung der verwandten Entitäten und der Serializer behandeln die verschachtelten Eigenschaften von Objekten. Der Serializer hat keine Probleme mit den Nullwerten. Bitte geben Sie uns mehr Kontext Ihres Fehlers, wie StackTrace

Übrigens habe ich einen Rat für Sie zu vermeiden, Ihren Controller zu verschmutzen. Sie sollten einen benutzerdefinierten Serializer erstellen. Diese symfony Dadurch wird diese Klasse automatisch rufen Sie Ihre Fichier Einheit serialisiert und Sie können in

class FichierSerializer implements NormalizerInterface 
{ 
    function __construct() 
    { 
     $encoder = new JsonEncoder(); 
     $normalizer = new ObjectNormalizer(); 
     $normalizer->setCircularReferenceHandler(function ($object) { 
      return $object->getId(); 
     }); 
     $this->setSerializer(new Serializer(array($normalizer), array($encoder))); 
    } 

    public function normalize($object, $format = null, array $context = []) 
    { 
      /** @var Fichier $object */ 

      return [ 
       'nom' => $object->getNom() 
       // Your data to return as json 
      ]; 
    } 

    public function supportsNormalization($data, $format = null) 
    { 
     return $data instanceof Fichier; 
    } 
} 

// In your FichierController.php ? 
public function getFichierAction($idFichier) { 
     $fichier = $this->getDoctrine()->getRepository(Fichier::class)->find($idFichier); 
     return Response::create($this->get('serializer')->serialize($fichier, 'json')); 
} 

Und dann diese Datei auf Ihrem services.yml hinzufügen

app.serializer.fichier: 
    class: ApiBundle\Serializer\FichierSerializer 
    tags: 
     - { name: serializer.normalizer } 
eigene Logik
Verwandte Themen