0

Ich habe eine Entität Acme\Bundle\Entity\Author, die eine Eins-zu-viele-Beziehung zu Acme\Bundle\Entity\Article hat und ich habe zwei JMS-Serializer-Ereignis-Abonnenten für beide Entitäten.JMS Serializer Event Subscriber Filtert Proxy-Klassen

Teilnehmer für Acme\Bundle\Entity\Author;

acm.author_serialization_listener: 
    class: Acm\Bundle\Listener\AuthorSerializationListener 
    tags: 
     - { name: jms_serializer.event_subscriber } 

class AuthorSerializationListener implements EventSubscriberInterface 
    { 
     /** 
     * @inheritdoc 
     */ 
     public static function getSubscribedEvents() 
     { 
      return array(
       array('event' => 'serializer.pre_serialize', 'class' => 'Acme\Bundle\Entity\Author' 'method' => 'onPreSerialize'), 
      ); 
     } 

    public function onPreSerialize(PreSerializeEvent $event) 
    { 
     if($event->getObject() instanceof Author) { 
      return; 
     } 
    } 
} 

Abonnent für Acme\Bundle\Entity\Article;

acm.article_serialization_listener: 
    class: Acm\Bundle\Listener\ArticleSerializationListener 
    tags: 
     - { name: jms_serializer.event_subscriber } 

class ArticleSerializationListener implements EventSubscriberInterface 
    { 
     /** 
     * @inheritdoc 
     */ 
     public static function getSubscribedEvents() 
     { 
      return array(
       array('event' => 'serializer.pre_serialize', 'class' => 'Acme\Bundle\Entity\Article' 'method' => 'onPreSerialize'), 
      ); 
     } 

     public function onPreSerialize(PreSerializeEvent $event) 
     { 
      if($event->getObject() instanceof Article) { 
       return; 
      } 
     } 
    } 

Das Problem in der onPreSerialize Funktion tritt auf, wenn Author zusammen mit verwandten Article s in der ArticleSerializationListener Teilnehmerklasse Serialisierung, wo es Proxies \ __ CG __ \ Acme \ Bundle \ Entity \ statt Artikel spritzt von Acme \ Bundle \ Entity \ Artikel Entitäten, die dazu führen, dass die zugehörigen Entitäten Article ausgeschlossen werden. Gibt es etwas, das ich falsch mache, oder gibt es einen Workaround dafür?

Antwort

0

Anstelle von get_class sollten Sie einfach den Operator instanceof verwenden, da die Proxys von den Entitäten erben. Sie vergleichen zwei Strings.

if($event->getObject() instanceof \Acme\Bundle\Entity\Article) { 
    return; 
} 

Sidenode: Auch der Betreiber !=== nicht vorhanden ist.

+0

Ihre Lösung funktioniert überhaupt nicht, da der Serializer nicht einmal die Entitäten benötigt, die er benötigt, da er sie aus dem 'class'-Filter im' getSubscribedEvents' selbst filtert. Ich habe meine Frage bearbeitet, um für Sie klarer zu sein. Danke für die Syntaxkorrektur! – ssrp

+1

Können Sie das Problem genauer beschreiben? – stepotronic

Verwandte Themen