2017-09-06 4 views
1

Ich bin sicher, es ist ein kleiner Fehler, aber ich kann es nicht finden. Ich versuche, the official doc zu folgen und einen Ereignis-Listener für das Ereignis pre_serialize zu implementieren.JMS Serializer-Ereignis funktioniert nicht

Mein Service Erklärung:

<service id="app.question_serializer_subscriber" class="AppBundle\Serializer\QuestionSerializerSubscriber"> 
    <tag name="jms_serializer.event_subscriber"/> 
</service> 

Mein Teilnehmer:

<?php 

namespace AppBundle\Serializer; 

use JMS\Serializer\EventDispatcher\EventSubscriberInterface; 
use JMS\Serializer\EventDispatcher\ObjectEvent; 

class QuestionSerializerSubscriber implements EventSubscriberInterface 
{ 
    public static function getSubscribedEvents() 
    { 
     return array(
      array(
       'event' => 'serializer.pre_serialize', 
       'method' => 'onPreSerialize', 
      ) 
     ); 
    } 

    public function onPreSerialize(ObjectEvent $event) 
    { 
     die('in event'); 
    } 
} 

Und mein Controller:

 $question = $repo->findLastVersionByQuestionId((int) $questionId); 
     $serializer = SerializerBuilder::create()->build(); 

     $context = new SerializationContext(); 
     return new JsonResponse(json_decode(
      $serializer->serialize(
       $question, 
       'json', 
       $context 
      ), 
      true 
     )); 

Wenn ich die Strecke Frage meiner Einheit Zugriff serialisiert und angezeigt, aber Warum wird die('in event'); nicht angezeigt?

Vielleicht hat es eine Beziehung mit der Tatsache, dass meine Aufgabe eine Lehre Entität (issue 666 oder PR 677)

Antwort

1

ich endlich das Problem finden. Das Problem ist,

$serializer = SerializerBuilder::create()->build(); 

Dies funktioniert nicht, aber dies tut:

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

großartig! Markieren Sie Ihre Antwort als akzeptiert, damit der Benutzer eine Lösung besser finden kann – Matteo

0

Versuchen Sie, die Klasse Attribut hinzufügen, wie zB:

public static function getSubscribedEvents() 
{ 
    return array(
     array(
      'event' => 'serializer.pre_serialize', 
      'class' => 'FQCN_class_name', 
      'method' => 'onPreSerialize', 
     ) 
    ); 
} 

Ein weiterer Unterschied in Bezug auf die doc in dem Argument der Klassenmethode: Sie sollten PreSerializeEvent statt ObjectEvent verwenden:

So wie folgt aus:

public function onPreSerialize(PreSerializeEvent $event) 
{ 
    // ... 
} 

Überprüfen Sie Ihren Dienst korrekt aus dem Behälter, wie zB mit dem Konsolenbefehl geladen wird:

php app/console debug:container --tag=jms_serializer.event_subscriber

Hope this Hilfe

+0

ich schon probiert, und ich versuchte, mit 'format' => 'json' auch, aber es funktioniert nicht :( – iBadGamer

+0

Sie können versuchen, mit der 'onPostSerialize' Methode, um zu sehen, ob das funktioniert – Matteo

+0

Ich habe die vier Ereignisse mit der gleichen Funktion verbunden (die mit dem Würfel) und mein Json wird immer noch angezeigt – iBadGamer