2017-07-20 32 views
0

我目前正在試圖序列相當複雜的對象,使其恢復爲JSON與Symfony的串行響應。我得到了以下對象:Symfony的ObjectNormalizer空屬性路徑

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

這是我的控制器代碼:

$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'); 

我收到以下錯誤:

The property path should not be empty.

一些測試後,我發現,如果我手動把我對象的空性,我不會得到這個錯誤,但另外一個地方在字符串轉換失敗。使此功能後:

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

我得到這個錯誤,考慮到ID = 4:

Notice: Undefined variable: 4

有沒有什麼辦法,使歸一化處理空的屬性,和/或修復這個錯誤?

回答

0

,因爲我沒有相關實體的映射和串行處理的對象的嵌套屬性是不容易的幫助。序列化程序對空值沒有任何問題。 請給我們更多的錯誤背景,像堆棧跟蹤

順便說一句,我有一個建議,以避免污染你的控制器。 您應該創建一個自定義串行器。這樣做symfony會自動調用這個類系列化你Fichier的實體,您可以在

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

添加自定義邏輯,然後添加到您的services.yml文件

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