2013-04-14 1 views
3

Fondamentalement, je veux désérialiser json à l'objet utilisateur. Comme cetteFOSUserBundle désérialisation à l'objet utilisateur throws "vous devez définir un type"

$serializer = $this->get('jms_serializer'); 

$data = $serializer->deserialize($this->get('request')->getContent(), 
           'My\FooBundle\Entity\User', 'json'); 

Les données de demande transmises à désérialiseur:

{"id":2,"username":"[email protected]","username_canonical":"[email protected]", ... } 

erreur Jeté:

request.CRITICAL: Uncaught PHP Exception JMS\Serializer\Exception\RuntimeException: "You must define a type for FOS\UserBundle\Model\User::$username." at ...\vendor\jms\serializer\src\JMS\Serializer\GenericDeserializationVisitor.php line 170 [] []

J'utilise sf 2.3. Y at-il quelque chose qui doit être mis en place pour la désérialisation de la classe d'utilisateurs fos? Une idée de pourquoi je reçois ce message et comment le réparer?

+0

Vous devriez jeter un oeil à [cette question] (http://stackoverflow.com/questions/12960141/jmsserializerbundle-no-control-over-third-party-meta-data). J'ai eu le même problème avec FOSUserBundle, car ces champs ne sont pas définis dans votre modèle 'My \ Foo \ Entity \ User' mais dans le modèle' FOS \ UserBundle \ Model \ User'. – tolgap

Répondre

7

Bonjour Je viens d'avoir le même problème aujourd'hui et a finalement trouvé comment faire face à cette question non,

pour chaque propriété dans un objet que vous voulez désérialiser, le paquet veut savoir que vous tapez attendre à avoir après La conversion. vous devez donc utiliser le type annotation \ fournie par le paquet dans votre classe d'entités et annote chaque propriété: http://jmsyst.com/libs/serializer/master/reference/annotations#type

ATTENTION: Coller est le mal! la déclaration d'utilisation dans l'exemple de référence est use JMS\Serializer\Annotation\Type; mais doit être le chemin réel au sérialiseur use JMS\SerializerBundle\Annotation\Type;

un exemple de mon code:

use JMS\SerializerBundle\Annotation\Type; 
    /** 
    * @ORM\Entity 
    * @ORM\Table(name="ecro_form") 
    */ 
    class Form { 

    /** 
    * @ORM\ManyToOne(targetEntity="eCRO\Bundle\UserBundle\Entity\User", inversedBy="forms") 
    * @ORM\JoinColumn(name="user_id", referencedColumnName="id") 
    * @Type("eCRO\Bundle\UserBundle\Entity\User") 
    */ 
    protected $user; // inherits from FOSUser 

Utilisez des annotations sur la classe abstraite FOSUser (emplacement: fournisseur \ FOS \ UserBundle \ Model \ User.php) pour que le sérialiseur sache comment faire son travail.

espérons que cela aidera!

Questions connexes