簡體   English   中英

Symfony ObjectNormalizer空屬性路徑

[英]Symfony ObjectNormalizer empty property path

我目前正在嘗試序列化一個非常復雜的對象,以使用Symfony序列化程序將其作為json中的響應返回 我得到以下對象:

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

我收到以下錯誤:

屬性路徑不能為空。

經過一些測試,我發現,如果手動設置對象的null屬性,則不會收到此錯誤,但會收到另一個錯誤,無法將其轉換為字符串。 完成此功能后:

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

考慮到id = 4,我收到此錯誤:

注意:未定義變量:4

有什么方法可以使規范化器處理null屬性和/或解決此錯誤?

幫助不容易,因為我還沒有相關實體的映射,而序列化程序卻處理對象的嵌套屬性。 序列化程序對於null值沒有任何問題。 請給我們更多有關您的錯誤的信息,例如stacktrace

順便說一句,我有一個建議給您,以避免污染您的控制器。 您應該創建一個自定義序列化程序。 進行此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 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM