2017-04-19 2 views
0

Je voudrais visiter récursive chaque propriété de l'entité sérialisation, vérifier si une chaîne est définie et vérifiez que la propriété de métadonnées est correctement réglé sur string, sinon changez-le afin de permettre la sérialisation.comment visiter chaque propriété de l'entité lorsque `événement serializer.pre_serialize` est élevé

Imaginez une propriété users qui est ArrayCollection, mais je force la valeur à être une chaîne dans les cas de coin.

J'ai mis un SerializationSubscriber pour attraper l'événement serializer.pre_serialize, mais je ne trouve aucun document pour tirer parti du Visitor et des environs.

Un conseil?

Répondre

0
class MyEventSubscriber implements JMS\Serializer\EventDispatcher\EventSubscriberInterface 
{ 
    public static function getSubscribedEvents() 
    { 
     return array(
      array('event' => 'serializer.pre_serialize', 'method' => 'onPreSerialize'), 
     ); 
    } 

    public function onPreSerialize(JMS\Serializer\EventDispatcher\PreSerializeEvent $event) 
    { 
     /* 
     * @var YourEntity $object 
     */ 
     $object = $event->getObject(); 
     $reflect = new \ReflectionClass($foo); 
     $props = $reflect->getProperties(\ReflectionProperty::IS_PRIVATE); 

     foreach ($props as $prop) { 
      $method = 'get'.ucfirst($prop->getName()); 

      // here is call of methods like getId(), getName() etc, 
      // depending on name of entity properties 
      $object->$method(); 
     } 
    } 
} 
+0

ouch! par réflexion? Assez cher, n'est-ce pas? – Bertuz

+0

En effet, mais cela fonctionne. –

+0

Malheureusement, ce n'est pas récursif: ce dont j'ai vraiment besoin est de visiter chaque propriété et de changer le type si nécessaire. Comme il n'y a pas d'événement pour attraper ce moment de la visite d'un nœud, je devrais revoir toute la propriété de l'entité comme suit JMSSerialize. Assez cher je dirais – Bertuz